看看下面的代码
initshared.rb
module InitShared
def init_shared
@shared_obj = "foobar"
end
end
myclass.rb
class MyClass
def initialize()
end
def init
file_name = Dir.pwd+"/initshared.rb"
if File.file?(file_name)
require file_name
include InitShared
if self.respond_to?'init_shared'
init_shared
puts @shared_obj
end
end
end
end
包含InitShared dos,因为它在方法内部不起作用。
我想检查文件,然后包含模块,然后访问该模块中的变量。
答案 0 :(得分:9)
而不是使用Samnang的
singleton_class.send(:include, InitShared)
您也可以使用
extend InitShared
它也是如此,但与版本无关。它只将模块包含在对象自己的单例类中。
答案 1 :(得分:0)
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 with this line:
# 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)