例如,假设我有
block = proc { |n| "#{downcase} #{n}" }
现在我想在 a 的范围内评估该块String
,但将该块传递一个变量。我知道如何做第一部分:
"Foo".instance_eval(&block)
但是如何也将变量传递给该块?
我试过
"Foo".instance_eval { block.call(3) }
但它不起作用,它不在String
.
instance_exec(arg...) {|var...| 块 } → 对象
在接收者 ( obj )的上下文中执行给定的块。为了设置上下文,在代码执行时将变量
self
设置为obj,从而使代码可以访问obj的实例变量。参数作为块参数传递。
所以这会成功:
"Foo".instance_exec(3, &block)
并给你'foo 3'
你想要的。
这个问题:
"Foo".instance_eval { block.call(3) }
将self
在"Foo"
inside{ block.call(3) }
但不在 inside 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) }
当proc被调用时,self
将是c
因为那self
是proc被定义的时候(m
即被调用的时候)。self
块内部的内容对 proc 内部instance_eval
没有任何影响。self