モジュールを使用してオブジェクト インスタンスを拡張する際に、特に Module クラスで extends_object コールバックを定義するときに問題が発生しました。私の理解では、次のようなことをすると次のようになります。
(s = String.new).extend SomeModule
SomeModule extends_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