我正在尝试调用对象foo的方法,就好像它是对象栏的方法一样。我尝试了两种方法:
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。从方法
开始的proc上的instance_eval这失败的原因是instance_eval将接收者作为附加参数传递而不是真正的接收者(afaik)
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
proc = m.to_proc
foo.instance_eval &proc
它表示:“out”中的:堆栈跟踪中错误的参数数量(1表示0)(ArgumentError)。
但是,当我使用它而不是最后一行时,它可以正常工作:
foo.instance_eval {
puts @name
}
答案 0 :(得分:2)
问题是#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>]
参数是调用方法的地方,self
来自此处的方法。我不知道如何在不解析这个额外参数的情况下调用该方法。