我正在阅读有关ruby作用域的信息,它说局部变量在定义它们的块之外不可访问。
例如,在下面的示例中。 b
不能在if
块
a = 3
while a<10 do
if a<5
b= 3
end
a+=1
end
puts b
但是由于某些原因,我可以在其定义的块之外访问b
答案 0 :(得分:4)
在Ruby中,“块”基本上是包含在do...end
内或花括号之间的代码。 (还有其他方法-在Ruby中创建块,但是这种定义将使您停留相当长的时间。)if...end
不被视为块。 while...end
都不是。使问题进一步复杂化的是,您在do
之后添加的while
也不是一个障碍。 Ruby只是有帮助地忽略了它。
Cary已经在评论中对此进行了解释,但是我可以为您澄清一下。我将简化并清理您的代码:
a = 3
while a < 10
b = a * 3
a += 1
end
puts b
这将给27。但是现在,如果我这样做:
a = 3
loop do
b = a * 3
a += 1
break if a == 10
end
puts b
我得到这个:
undefined local variable or method `b' for main:Object (NameError)
这就是您所期望的。这是因为while
是一个语句。 while...end
可以包含多行代码,但不算作一个块。 (if
的Ditto。)但是loop
实际上是一种以块为参数的方法,因此适用Cary在其注释中描述的作用域规则。