当涉及到运行时内省和动态代码生成时,我不认为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_eval
,module_eval
和define_method
的各种组合。是否有在线/离线资源,我可以在其中找到有关此类动态技巧的更多信息?
答案 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。