module InitShared
def init_shared
@shared_obj = "foobar"
end
end
class MyClass
def init
if true
self.class.send(:include, InitShared)
if self.respond_to?'init_shared'
init_shared
puts @shared_obj
end
end
end
end
MyClass.new.init
: include - это метод закрытого класса, поэтому его нельзя вызывать в методе уровня экземпляра.Другое решение, если вы хотите включить этот модуль только для конкретного экземпляра, вы можете заменить строку на: include с этой строкой:
# Ruby 1.9.2
self.singleton_class.send(:include, InitShared)
# Ruby 1.8.x
singleton_class = class << self; self; end
singleton_class.send(:include, InitShared)