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: ...>