例如,假设我有
block = proc { |n| "#{downcase} #{n}" }
现在我想在String
的范围内评估该块,但是将该块传递给变量。我知道如何做第一部分:
"Foo".instance_eval(&block)
但是如何将变量传递给该块呢?
我试过
"Foo".instance_eval { block.call(3) }
但它不起作用,它不在String
范围内。
答案 0 :(得分:8)
改为使用instance_exec
:
instance_exec(arg ...){| var ... |阻止}→obj
在接收器的上下文中执行给定的块( obj )。为了设置上下文,变量
self
在代码执行时设置为 obj ,使代码可以访问 obj 的实例变量。参数作为块参数传递。
所以这将使它成为现实:
"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
调用proc时,c
将为self
,因为这是m
定义proc时的内容(即调用self
时)。 instance_eval
块中的self
对proc内的{{1}}没有任何影响。