Ruby 猴子补丁:define_方法优先于bind吗?
在下面的代码片段中,我使用Ruby 猴子补丁:define_方法优先于bind吗?,ruby,Ruby,在下面的代码片段中,我使用define_方法块来修补Foo#bar。在初始化Foo的新实例后,我使用对父类bar方法的bind调用覆盖它,但是当我调用该方法时,调用由define\u方法定义的块。为什么bind调用不改变方法的行为 class OriginalFoo def bar puts 'in OriginalFoo!' end end class Foo < OriginalFoo def bar puts 'in Foo' end end cl
define_方法
块来修补Foo#bar
。在初始化Foo
的新实例后,我使用对父类bar
方法的bind
调用覆盖它,但是当我调用该方法时,调用由define\u方法定义的块。为什么bind
调用不改变方法的行为
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
class OriginalFoo
def棒
放上“原汁原味!”
结束
结束
类Foo#
OriginalFoo.instance_方法(:bar).bind(foo_实例)#=>#
foo_instance.bar
#>>在定义方法块中
#>>在富
您误解了工作原理。您调用以获取一个未绑定的方法(即没有self
的方法):
但这不会改变foo_实例
中的方法,它所做的只是当(或如果)你说m.call
:um.bind(obj)
对obj
没有任何作用时,使self
成为你的foo_实例
,它只是给你um
一个obj
作为其self
的方法,你是在问为什么OriginalFoo.instance\u方法(:bar.bind(foo\u instance)
没有任何明显的效果吗?@muistooshort:我想,这个问题的灵感来自这样的东西,注意:define_方法/补丁是不相关的(不会以任何方式改变正在发生的事情)。即使您将其注释掉,此代码仍然不会打印“in OriginalFoo!”。但是您没有使用方法
实例执行任何操作,OriginalFoo.instance\u方法(:bar).bind(foo\u实例)
返回,您只是将其丢弃。@muistooshort:JFC,我怎么会错过它??好的,睡觉时间:)
OriginalFoo.instance_method(:bar)
# #<UnboundMethod: ... >
m = OriginalFoo.instance_method(:bar).bind(foo_instance)
# => #<Method: ...>