例如,假设我有
block = proc { |n| "#{downcase} #{n}" }
Run Code Online (Sandbox Code Playgroud)
现在我想在a的范围内评估该块String,但是将该块传递给变量.我知道如何做第一部分:
"Foo".instance_eval(&block)
Run Code Online (Sandbox Code Playgroud)
但是如何将变量传递给该块呢?
我试过了
"Foo".instance_eval { block.call(3) }
Run Code Online (Sandbox Code Playgroud)
但它不起作用,它不在范围内String.
instance_exec改为使用:
instance_exec(arg ...){| var ... | block}→obj
在接收器(obj)的上下文中执行给定的块.为了设置上下文,在代码执行时将变量
self设置为obj,使代码能够访问obj的实例变量.参数作为块参数传递.
所以这将使它成为现实:
"Foo".instance_exec(3, &block)
Run Code Online (Sandbox Code Playgroud)
并给你'foo 3'你想要的.
这个问题:
"Foo".instance_eval { block.call(3) }
Run Code Online (Sandbox Code Playgroud)
是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) }
Run Code Online (Sandbox Code Playgroud)
当proc被调用时,self将是c因为那self是proc定义时(m即被调用时).什么self是里面的instance_eval块没有任何效果上self的proc中.