ruby:使用模块包含类的实例方法

时间:2011-02-09 09:30:16

标签: ruby module

看看下面的代码

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,因为它在方法内部不起作用。

我想检查文件,然后包含模块,然后访问该模块中的变量。

2 个答案:

答案 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)