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

Ruby:捕获发送到对象的所有方法,ruby,metaprogramming,Ruby,Metaprogramming,我正在创建一个奇怪的类,我想捕获发送到该类对象的每个方法。我可以用缺少的方法实现我想要的大部分 class MyClass def method_missing m, *args # do stuff end end 然后,问题是MyClass从对象继承的所有实例方法。我可以逐一检查每种方法并重新定义它们,但我希望有一种更灵活的方法。我尝试过的所有元编程方法在尝试接触这些实例方法时都出现了名称错误。如果您使用的是Ruby 1.9,您可以让您的类继承自BasicO

我正在创建一个奇怪的类,我想捕获发送到该类对象的每个方法。我可以用缺少的方法实现我想要的大部分

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

然后,问题是MyClass从对象继承的所有实例方法。我可以逐一检查每种方法并重新定义它们,但我希望有一种更灵活的方法。我尝试过的所有元编程方法在尝试接触这些实例方法时都出现了名称错误。

如果您使用的是Ruby 1.9,您可以让您的类继承自
BasicObject
,以获得一个干净的工作环境:


正如@DanCheail的评论和答案所指出的,如果您使用的是ruby 1.9+,那么您应该使用
BasicObject
而不是
对象的未定义方法。在发布这篇文章时,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

如果你使用Ruby 1.8,你可以考虑使用BalkStand GEM。

这是我正在寻找的东西,但是一个微不足道的尝试给了我一个<代码> StastStAcError:当定义<代码>方法>缺少时,堆栈级别太深。嗯……你在
方法中做什么?如果您执行类似于
put*args
的操作,您将得到一个无限
方法\u missing
循环。如果您需要
内核
方法,您必须调用
::Kernel.put
等。这正是我要找的!使用BasicObject要好得多,因为它可以完成相同的任务,而且更安全。当这个答案发布时,1.8在生产场景中仍然非常常见,因此
BasicObject
还不存在。