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

Jel*_*Cat 0 ruby metaprogramming instance-methods

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

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

def my_meth
  puts self.foo
end

class MyCls
  attr_accessor :foo
end

my_obj = MyCls.new
my_obj.my_meth
Run Code Online (Sandbox Code Playgroud)

我怎么能简单地附加my_methmy_obj上面的代码的最后一行中的方法调用?

jde*_*eno 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
Run Code Online (Sandbox Code Playgroud)

除非您需要像这样混合使用模块,否则通常会对include您的模块更好:

class MyCls
   include Foo
   attr_accessor :foo
end
Run Code Online (Sandbox Code Playgroud)