我正在制作一个奇怪的类,我希望捕获发送给该类对象的每个方法。我可以使用method_missing来实现我想要的大部分内容,例如
class MyClass
def method_missing m, *args
# do stuff
end
end
问题是MyClass从Object继承的所有实例方法。我可以逐个完成每个方法并重新定义它们,但我希望有一个更灵活的方法。当我尝试触摸那些实例方法时,我尝试过的所有元编程方法都抱怨了NameError。
答案 0 :(得分:12)
正如@DanCheail的评论和回答中所述,如果你使用的是ruby 1.9+,你应该使用BasicObject
而不是Object
的定义方法。在这篇文章发布时,1.8.x的使用仍然非常普遍,尽管1.9已经发布了一段时间。
不是试图“重新定义”任何东西,而是将对象包装在一个空白(大部分)代理对象中,如:
class MyProxy
instance_methods.each do |meth|
# skipping undef of methods that "may cause serious problems"
undef_method(meth) if meth !~ /^(__|object_id)/
end
def initialize(object)
@object = object
end
def method_missing(*args)
# do stuff
p args
# ...
@object.send(*args)
end
end
MyProxy.new(MyClass.new).whatever
答案 1 :(得分:5)
如果您使用的是Ruby 1.9,那么您可以让您的类继承自BasicObject
以获得干净的平台:
答案 2 :(得分:1)
如果您使用的是Ruby 1.8,可以考虑使用blankslate gem。