Ruby:捕获发送到对象的所有方法

时间:2011-08-25 02:46:25

标签: ruby metaprogramming

我正在制作一个奇怪的类,我希望捕获发送给该类对象的每个方法。我可以使用method_missing来实现我想要的大部分内容,例如

class MyClass
    def method_missing m, *args
        # do stuff
    end
end

问题是MyClass从Object继承的所有实例方法。我可以逐个完成每个方法并重新定义它们,但我希望有一个更灵活的方法。当我尝试触摸那些实例方法时,我尝试过的所有元编程方法都抱怨了NameError。

3 个答案:

答案 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以获得干净的平台:

http://ruby-doc.org/core-1.9/classes/BasicObject.html

答案 2 :(得分:1)

如果您使用的是Ruby 1.8,可以考虑使用blankslate gem。