加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:30:49 所属栏目:百科 来源:网络整理
导读:我正在制作一个奇怪的类,我想要捕获发送到类的一个对象的每个方法.我可以使用method_missing来实现我想要的大部分内容. class MyClass def method_missing m,*args # do stuff endend 那么问题就是MyClass从Object继承的所有实例方法.我可以一个接一个地遍历
我正在制作一个奇怪的类,我想要捕获发送到类的一个对象的每个方法.我可以使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读