Ruby中的块和变量范围
摘自Russ Olsen雄辩的Ruby第226页: 打开前可见的所有变量都是或{ 在代码块中仍然可见。代码块在创建它们的范围内拖动到任何地方 为了亲自看到这一点,我运行了以下代码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
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
换句话说:一个块在创建它的作用域上关闭,而不是在调用它的地方关闭