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



在运行时内省和动态代码生成方面,我认为ruby没有任何竞争对手,除了一些lisp方言。前几天,我做了一些代码练习来探索ruby的动态功能,我开始想知道如何将方法添加到现有对象中。以下是我可以想到的3种方法:

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的各种组合。有没有在线/离线资源可以让我了解更多关于这种动态技巧的信息?

Ruby元编程似乎是一种很好的资源。(从那里链接到《红宝石之书》。)

如果obj有一个超类,您可以使用define_method(API)将方法从超类添加到obj。如果你看过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

我喜欢《元编程Ruby》一书,这本书是由匹克斧出版社出版的。

相关内容

  • 没有找到相关文章

最新更新