Ruby 在不同的上下文中使用方法,实例_eval会添加不需要的参数

Ruby 在不同的上下文中使用方法,实例_eval会添加不需要的参数,ruby,metaprogramming,Ruby,Metaprogramming,我试图调用一个对象foo的方法,就好像它是一个对象bar的方法一样。我尝试了两种方法: 1。取消绑定和绑定-由于类不同而失败 class Foo def initialize @name = "John" end end class Bar def out puts @name end end foo = Foo.new bar = Bar.new m = bar.method :out foo.instance_eval m.unbind.bind(foo

我试图调用一个对象foo的方法,就好像它是一个对象bar的方法一样。我尝试了两种方法:

1。取消绑定和绑定-由于类不同而失败

class Foo
  def initialize
    @name = "John"
  end
end

class Bar
  def out
    puts @name
  end
end

foo = Foo.new
bar = Bar.new

m = bar.method :out
foo.instance_eval m.unbind.bind(foo)
2。实例\u评估从方法生成的过程

如果实例_eval将receiver作为附加参数而不是实际receiver(afaik)传递,则此操作失败

它说:在'out'中:stacktrace中的参数数量错误(1代表0)(ArgumentError)

但是,当我使用这一行而不是最后一行时,效果很好:

foo.instance_eval {
  puts @name
}
问题是
#instance_eval
向块发送一个参数,该参数就是它自身的对象。所以你可以做到:

# ...
class Bar
  def out(foo_object)
    [@name, foo_object, self]
  end
end
# ...
m = bar.method :out
foo.instance_eval &m    # => ["John", #<Foo:0x1c11b10>, #<Bar:0x1bb2470>]
#。。。
分类栏
def out(foo_对象)
[@name,foo_object,self]
结束
结束
# ...
m=棒。方法:输出
foo.instance_eval&m#=>[“John”、#、#]
参数是调用方法的位置,
self
就是从这里调用方法的。我不知道如何在不解析这个额外参数的情况下调用该方法

# ...
class Bar
  def out(foo_object)
    [@name, foo_object, self]
  end
end
# ...
m = bar.method :out
foo.instance_eval &m    # => ["John", #<Foo:0x1c11b10>, #<Bar:0x1bb2470>]