我正在阅读有关 ruby 作用域的内容,它说局部变量在定义它们的 block 之外无法访问。
例如,在下面的示例中。 b
不应在 if
block 之外访问
a = 3
while a<10 do
if a<5
b= 3
end
a+=1
end
puts b
但由于某种原因,我可以在定义的 block 之外访问 b
最佳答案
在 Ruby 中,“ block ”基本上是包含在 do...end
内或花括号之间的代码。 (还有其他方法(某种程度上)可以在 Ruby 中创建 block ,但这个定义会让您花很长一段时间。) if...end
不被视为 block 。 while...end
也不是。让问题更加复杂的是,在 while
之后添加的 do
也不会使其成为一个 block ; Ruby 只是忽略了它。
卡里已经在评论中解释了这一点,但我会看看是否可以为您澄清一下。我将稍微简化和清理您的代码:
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
可能包含多行代码,但它不算一个 block 。 (if
也是如此。)但是 loop
实际上是一种将 block 作为参数的方法,因此 Cary 在其评论中描述的范围规则适用。
关于ruby - block 外部可访问的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351147/