有多少种方法可以添加到ruby对象?

时间:2011-06-13 06:00:24

标签: ruby metaprogramming dynamic-code

当涉及到运行时内省和动态代码生成时,我不认为ruby有任何竞争对手,除了可能的一些lisp方言。前几天我正在做一些代码练习来探索ruby的动态设施,我开始想知道如何向现有对象添加方法。以下是我能想到的三种方式:

obj = Object.new

# add a method directly
def obj.new_method
  ...
end

# add a method indirectly with the singleton class
class << obj
  def new_method
    ...
  end
end

# add a method by opening up the class
obj.class.class_eval do
  def new_method
    ...
  end
end

这只是冰山一角,因为我还没有探索instance_evalmodule_evaldefine_method的各种组合。是否有在线/离线资源,我可以在其中找到有关此类动态技巧的更多信息?

3 个答案:

答案 0 :(得分:4)

Ruby Metaprogramming似乎是一个很好的资源。 (并且,从那里链接,The Book of Ruby。)

答案 1 :(得分:3)

如果obj有超类,您可以使用obj (API)从超类中向define_method添加方法。如果你看过Rails源代码,你会注意到他们这么做了。

虽然这并不是您所要求的,但您可以轻松地使用method_missing动态创建几乎无限数量的方法:

def method_missing(name, *args)
  string_name = name.to_s
  return super unless string_name =~ /^expected_\w+/
  # otherwise do something as if you have a method called expected_name
end

将它添加到您的类将允许它响应任何看起来像

的方法调用
@instance.expected_something

答案 2 :(得分:2)

我喜欢由镐书的出版商出版的书Metaprogramming Ruby