gpt4 book ai didi

ruby - 在特定范围内评估 block 并传递参数

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:11 26 4
gpt4 key购买 nike

例如,假设我有

block = proc { |n| "#{downcase} #{n}" }

现在我想在 String 的范围内评估该 block ,但将该 block 传递给一个变量。我知道如何做第一部分:

"Foo".instance_eval(&block)

但是如何将变量也传递给那个 block 呢?

我试过了

"Foo".instance_eval { block.call(3) }

但是没用,它不在String的范围内。

最佳答案

使用 instance_exec 相反:

instance_exec(arg...) {|var...| block } → obj

Executes the given block within the context of the receiver (obj). In order to set the context, the variable self is set to obj while the code is executing, giving the code access to obj’s instance variables. Arguments are passed as block parameters.

这样就可以了:

"Foo".instance_exec(3, &block)

然后给你 'foo 3'你想要的。

这个问题:

"Foo".instance_eval { block.call(3) }

self吗将是 "Foo"里面{ block.call(3) }但不在里面block , block将保留任何 self是什么时候block被定义; block.call(3) 里什么都没有强制上下文所以self没有改变。例如,鉴于此:

class C
def m
proc { |n| "#{downcase} #{n}" }
end
end
c = C.new
"Foo".instance_eval { c.m.call(3) }

调用过程时,self将是 c因为这就是self是定义过程的时间(即调用 m 时)。什么selfinstance_eval 里面 block 对 self 没有任何影响在过程中。

关于ruby - 在特定范围内评估 block 并传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239680/

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