7

例如,假设我有

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

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

"Foo".instance_eval(&block)

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

我试过

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

但它不起作用,它不在String.

4

1 回答 1

8

改用instance_exec

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 blockblock将保留定义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) }

当proc被调用时,self将是c因为那self是proc被定义的时候(m即被调用的时候)。self块内部的内容对 proc 内部instance_eval没有任何影响。self

于 2012-09-02T21:17:19.007 回答