来自Russ Olsen的 Eloquent Ruby 的第226页:
在开场之前可见的所有变量执行或 { 在代码块中仍然可见。代码块沿着它们创建它们的范围拖动。
为了亲自看到这个,我运行了以下代码
class Foo
def initialize
@a = 1
end
def show_a
puts "from method: value of a is #{@a}"
yield
end
end
bar = Foo.new
bar.show_a {puts "from block: value of a is #{@a}"}
令我惊讶的是,输出是
from method:a的值为1
from block:a的值是
为什么@a的值没有进入块?
答案 0 :(得分:3)
在bar.show_a {puts "from block: value of a is #{@a}"}
之前,坚持puts @a
。那也是零。您会发现该范围内没有@a
实例变量可见,因为@a
是Foo类的实例变量。所以该区块忠实地反映了周围范围内@a
的缺失。
换句话说:一个块在创建的范围内关闭,而不是 。