使用模块扩展对象实例时遇到一些麻烦,特别是当我在 Module 类中定义 extend_object 回调时。我的理解是,当您执行以下操作时:
(s = String.new).extend SomeModule
调用 SomeModule extend_object 回调。情况似乎是这样,但是当我包含回调时, SomeModule 中定义的实例方法在对象中都不可见。一些代码应该更好地解释这一点:
module M1
def self.extend_object(o)
end
def test_method
true
end
end
module M2
def test_method
true
end
end
(x = String.new).extend(M1)
(y = String.new).extend(M2)
然后,
x.methods.include?("test_method")
=> false
y.methods.include?("test_method")
=> true
进一步来说,
x.singleton_methods
=> []
y.singleton_methods
=> ["test_method"]
有任何想法吗?
参考:
http://www.ruby-doc.org/core/classes/Module.html#M001660
http://www.ruby-doc.org/core/classes/Object.html#M000337