При попытке добавить собственное поведение к классу Object
я получаю нежелательные эффекты, которые не возникают при смешивании модуля в пользовательском режиме, определенного класса.Смешивание в модуле внутри объекта приводит к тому, что все объекты наследуют методы экземпляра этого модуля как методы одиночного вызова.
module Entity
def some_instance_method
puts 'foo'
end
def self.secret_class_method
puts 'secret'
end
module ClassMethods
def some_class_method
puts 'bar'
end
end
def self.included(other_mod)
other_mod.extend(ClassMethods)
end
end
Теперь я создаю класс Bob
таким образом, что она включает в себя Entity
.
class Bob; include Entity; end;
Это дает желаемый и ожидаемый результат:
Bob.secret_class_method #=> NoMethodError
Bob.some_instance_method #=> NoMethodError
Bob.some_class_method #=> bar
Bob.new.secret_class_method #=> NoMethodError
Bob.new.some_instance_method #=> foo
Bob.new.some_class_method #=> NoMethodError
Но если вместо определения класса Bob
я должен был открыть класс Object
и включают в себя Entity
так:
class Object; include Entity; end
Тогда я вижу следующее:
Object.secret_class_method #=> NoMethodError
Object.some_instance_method #=> foo
Object.some_class_method #=> bar
Object.new.secret_class_method #=> NoMethodError
Object.new.some_instance_method #=> foo
Object.new.some_class_method #=> NoMethodError
Если я тогда определяю класс Bob
, он ведет себя точно так же: some_instance_method
можно назвать по классу Bob
. Кажется, что-то о самом классе Object
возится с поведением этого шаблона, иначе я просто делаю что-то не так. Может кто-нибудь объяснить это странное поведение? Я не хочу, чтобы все мои Object
s наследовали методы экземпляра как методы singleton!
Ahhh это имеет смысл * кивать *. Мне еще предстоит полностью окунуться в идею класса Class и что это означает для иерархии наследования Ruby. Спасибо за разъяснение, сэр. – DesAdams