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

时间:2012-09-02 20:54:14

标签: ruby block

例如,假设我有

block = proc { |n| "#{downcase} #{n}" }

现在我想在String的范围内评估该块,但是将该块传递给变量。我知道如何做第一部分:

"Foo".instance_eval(&block)

但是如何将变量传递给该块呢?

我试过

"Foo".instance_eval { block.call(3) }

但它不起作用,它不在String范围内。

1 个答案:

答案 0 :(得分:8)

改为使用instance_exec

  

instance_exec(arg ...){| var ... |阻止}→obj

     

在接收器的上下文中执行给定的块( obj )。为了设置上下文,变量self在代码执行时设置为 obj ,使代码可以访问 obj 的实例变量。参数作为块参数传递。

所以这将使它成为现实:

"Foo".instance_exec(3, &block)

并提供您想要的'foo 3'

这个问题:

"Foo".instance_eval { block.call(3) }

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) } 不会改变。例如,鉴于此:

self

调用proc时,c将为self,因为这是m定义proc时的内容(即调用self时)。 instance_eval块中的self对proc内的{{1}}没有任何影响。