当尝试将我自己的行为添加到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
如果我然后定义 class Bob
,它的行为方式相同:some_instance_method
可以在 class 上调用Bob
。似乎Object
类本身的某些东西正在扰乱这种模式的行为,或者我只是在这里做错了什么。有人可以解释这种奇怪的行为吗?我不希望我的所有Object
s 都继承实例方法作为单例方法!