评估特定范围内的块并传递参数

jan*_*o-m 7 ruby block

例如,假设我有

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.

mu *_*ort 8

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将保留selfblock定义时的任何内容; 在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中.