例如,假设我有
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