【发布时间】:2022-01-17 22:37:32
【问题描述】:
我在 ruby 的一个块中与变量范围作斗争。我了解到while、until 或for 之后的do..end 循环不是块,因为while、until 或for 不是方法调用。所以他们不会创建自己的内部范围。但是这个例子让我很困惑
loop do
b = 2
p b # => 2
break
end
p b
在此示例中,b 使用 do..end 内的数字 2 进行初始化。调用 puts 方法时将变量 b 作为参数传递给它,并通过 NameError 传递给它。说b 是未定义的局部变量,但正如我之前所说
while、until 或 for 循环之后的 do..end 不会创建自己的内部范围
【问题讨论】:
-
正如您提到的
while、until和for是keywords 并且不创建局部变量范围。另一方面,loop是一个实现为Kernel#loop的方法调用,它与 ruby 中的其他块调用遵循相同的词法块作用域。
标签: ruby scope local-variables