例如,假设我有
block = proc { |n| "#{downcase} #{n}" }
现在,我想在String
的作用域中计算该块的值,但将该块传递给一个变量。我知道如何做第一部分:
"Foo".instance_eval(&block)
但是如何也将一个变量传递给该块呢?
我试过了
"Foo".instance_eval { block.call(3) }
但它不起作用,它不在String
的范围内。
发布于 2012-09-03 05:17:19
请改用instance_exec
:
instance_exec(arg...) {|var...| }→obj block
在接收方(obj)的上下文中执行给定块。为了设置上下文,在代码执行时将变量self
设置为obj,从而使代码能够访问obj的实例变量。参数作为块参数传递。
因此,这将使它运行:
"Foo".instance_exec(3, &block)
然后给你你想要的'foo 3'
。
这样做的问题:
"Foo".instance_eval { block.call(3) }
self
将在{ block.call(3) }
中是"Foo"
,而不是在block
中,block
将保留定义block
时的任何self
;block.call(3)
中没有强制上下文的东西,所以self
不会改变。例如,给定以下内容:
class C
def m
proc { |n| "#{downcase} #{n}" }
end
end
c = C.new
"Foo".instance_eval { c.m.call(3) }
当proc被调用时,self
将为c
,因为当proc被定义时(即调用m
时),它就是self
。instance_eval
块中的self
对proc中的self
没有任何影响。
https://stackoverflow.com/questions/12239680
复制相似问题