Ruby中的块和变量范围

Ruby中的块和变量范围,ruby,Ruby,摘自Russ Olsen雄辩的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

摘自Russ Olsen雄辩的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}"}
令我惊讶的是,结果是

从方法:a的值为1

from块:a的值为


为什么@a的值没有进入块?

就在
bar.show_a{puts”from block之前:a的值是{@a}
,插入一个
放置@a
。该值也将为零。您将发现该范围内没有可见的
@a
实例变量,因为
@a
是Foo类的实例变量。因此,该块忠实地反映了周围范围内缺少
@a


换句话说:块关闭在创建它的作用域上,而不是调用它的位置。

就在
bar.show_A{puts”from block:A的值是{@A}
,插入一个
放置@a
。该值也将为零。您将发现该范围内没有可见的
@a
实例变量,因为
@a
是Foo类的实例变量。因此,该块忠实地反映了周围范围内缺少
@a


换句话说:块关闭在创建它的作用域上,而不是调用它的位置。

就在
bar.show_A{puts”from block:A的值是{@A}
,插入一个
放置@a
。该值也将为零。您将发现该范围内没有可见的
@a
实例变量,因为
@a
是Foo类的实例变量。因此,该块忠实地反映了周围范围内缺少
@a


换句话说:块关闭在创建它的作用域上,而不是调用它的位置。

就在
bar.show_A{puts”from block:A的值是{@A}
,插入一个
放置@a
。该值也将为零。您将发现该范围内没有可见的
@a
实例变量,因为
@a
是Foo类的实例变量。因此,该块忠实地反映了周围范围内缺少
@a

换句话说:一个块在创建它的作用域上关闭,而不是在调用它的地方关闭