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

ruby – Monkey补丁:define_method优先于bind吗?

发布时间:2020-12-17 02:49:57 所属栏目:百科 来源:网络整理
导读:在下面的代码片段中,我使用define_method块来修补Foo #bar.在初始化Foo的新实例之后,我使用对父类bar方法的绑定调用来覆盖它,但是当我调用该方法时,将调用define_method块定义的块.为什么绑定调用不会改变方法的行为? class OriginalFoo def bar puts 'in O
在下面的代码片段中,我使用define_method块来修补Foo #bar.在初始化Foo的新实例之后,我使用对父类bar方法的绑定调用来覆盖它,但是当我调用该方法时,将调用define_method块定义的块.为什么绑定调用不会改变方法的行为?

class OriginalFoo
  def bar
    puts 'in OriginalFoo!'
  end
end

class Foo < OriginalFoo
  def bar
    puts 'in Foo'
  end
end

class Foo < OriginalFoo
  old_bar = instance_method(:bar)
  define_method(:bar) do
    puts 'in define_method block'
    old_bar.bind(self).call
  end
end

foo_instance = Foo.new # => #<Foo:0x00007fe3ff037038>
OriginalFoo.instance_method(:bar).bind(foo_instance) # => #<Method: OriginalFoo#bar>
foo_instance.bar
# >> in define_method block
# >> in Foo

解决方法

你误解了 UnboundMethod#bind是如何工作的.你调用 Module#instance_method得到一个UnboundMethod(即没有自我的方法):

OriginalFoo.instance_method(:bar)
# #<UnboundMethod: ... >

然后调用UnboundMethod#bind将self附加到该方法,该方法返回一个Method实例:

m = OriginalFoo.instance_method(:bar).bind(foo_instance)
# => #<Method: ...>

但这不会改变foo_instance中的方法,它所做的只是让你自己成为你的foo_instance当你说m.call时:um.bind(obj)对obj没有任何作用,它只是给你你一个以obj为自己的方法.

(编辑:李大同)

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

    推荐文章
      热点阅读