gpt4 book ai didi

ruby - 在不同的上下文中使用方法,instance_eval 添加不需要的参数

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:03 24 4
gpt4 key购买 nike

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

<强>1。解除绑定(bind)和绑定(bind) - 由于类不同而失败

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。 instance_eval on 由方法产生的过程

这失败了,因为 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
}

最佳答案

问题是 #instance_eval 向 block 发送一个参数,该参数是它自身的对象。所以你可以这样做:

# ...
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 是方法所在的地方。我不知道如何在不解析这个额外参数的情况下调用该方法。

关于ruby - 在不同的上下文中使用方法,instance_eval 添加不需要的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com