Ruby中的块和变量范围

时间:2014-04-21 21:44:27

标签: ruby

来自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的值没有进入块?

1 个答案:

答案 0 :(得分:3)

bar.show_a {puts "from block: value of a is #{@a}"}之前,坚持puts @a。那也是零。您会发现该范围内没有@a实例变量可见,因为@a是Foo类的实例变量。所以该区块忠实地反映了周围范围内@a的缺失。

换句话说:一个块在创建的范围内关闭,而不是