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为自己的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |