Ruby 在不同的上下文中使用方法,实例_eval会添加不需要的参数
我试图调用一个对象foo的方法,就好像它是一个对象bar的方法一样。我尝试了两种方法: 1。取消绑定和绑定-由于类不同而失败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
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>]