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我不定义类,而是打开类ObjectEntity像这样包含:

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

如果我然后定义 class Bob,它的行为方式相同:some_instance_method可以在 class 上调用Bob。似乎Object类本身的某些东西正在扰乱这种模式的行为,或者我只是在这里做错了什么。有人可以解释这种奇怪的行为吗?我不希望我的所有Objects 都继承实例方法作为单例方法!

4

1 回答 1

1

Bobia 一个对象(更准确地说:Bob是 的实例Class,它是 的子类,Module是 的子类Object,是 的子类Entity),因此它具有Entity的方法。这就是继承的工作原理。

于 2013-07-16T22:32:38.380 回答