我正在制作一个奇怪的类,我想要捕获发送到类的一个对象的每个方法.我可以使用method_missing来实现我想要的大部分内容.
class MyClass def method_missing m,*args # do stuff end end
那么问题就是MyClass从Object继承的所有实例方法.我可以一个接一个地遍历各种方法,重新定义它们,但我希望能够采用更灵活的方法.当我尝试触摸这些实例方法时,我尝试过的所有元编程方法都抱怨了一个NameError.
解决方法
正如@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