2013-07-16 2 views
0

При попытке добавить собственное поведение к классу 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!

ответ

0

Bob Ia объект (точнее: Bob является экземпляром Class, который представляет собой подкласс Module который представляет собой подкласс Object, который представляет собой подкласс Entity), поэтому она имеет Entity «ы методов. Вот как работает наследование.

+0

Ahhh это имеет смысл * кивать *. Мне еще предстоит полностью окунуться в идею класса Class и что это означает для иерархии наследования Ruby. Спасибо за разъяснение, сэр. – DesAdams

 Смежные вопросы

  • Нет связанных вопросов^_^