在运行时内省和动态代码生成方面,我认为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_eval
、module_eval
和define_method
的各种组合。有没有在线/离线资源可以让我了解更多关于这种动态技巧的信息?
如果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》一书,这本书是由匹克斧出版社出版的。