在Ruby中动态添加(预定义的)实例方法

时间:2011-06-20 19:16:49

标签: ruby metaprogramming instance-methods

我看到如何使用def [instance].[methodname]; [...]; end向Ruby中的实例动态添加方法。

但是,我有兴趣将另一个位置中存在的方法附加到给定实例。 e.g。

def my_meth
  puts self.foo
end

class MyCls
  attr_accessor :foo
end

my_obj = MyCls.new
my_obj.my_meth

我怎样才能简单地将my_meth附加到my_obj,以便上述代码的最后一行中的方法调用可以正常工作?

1 个答案:

答案 0 :(得分:5)

您可以使用includeextend向您的班级添加模块,例如。 extend

module Foo
  def my_meth
    puts self.foo
  end
end

class MyCls
  attr_accessor :foo
end

my_obj = MyCls.new
my_obj.extend(Foo)
my_obj.foo = "hello"
my_obj.my_meth

除非你需要动态混合一个模块,否则你的模块include通常会更好:

class MyCls
   include Foo
   attr_accessor :foo
end