Возникли проблемы с расширением экземпляра объекта с помощью модуля, особенно когда я определяю обратный вызов extend_object в классе Module. Насколько я понимаю, когда вы делаете что-то вроде:
(s = String.new) .extend SomeModule
Вызывается обратный вызов SomeModule extension_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