我正在阅读有关 ruby 作用域的内容,它说局部变量在定义它们的块之外无法访问。
例如,在下面的例子中。b不应该在if块之外访问
a = 3
while a<10 do
if a<5
b= 3
end
a+=1
end
puts b
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我可以访问b它定义的块的外部
在 Ruby 中,“块”基本上是包含在大括号内do...end或花括号之间的代码。(还有其他方法 \xe2\x80\x94 类似于 \xe2\x80\x94 在 Ruby 中创建块,但这个定义会让你花很长一段时间。)if...end不被视为块。既不是while...end。使问题进一步复杂化的是,do您在 后面添加的while也不会使其成为一个块;Ruby 只是忽略了它。
卡里已经在评论中解释了这一点,但我会看看是否可以为您澄清一下。我将稍微简化和清理您的代码:
\n\na = 3\nwhile a < 10\n b = a * 3 \n a += 1\nend\nputs b\nRun Code Online (Sandbox Code Playgroud)\n\n这将给出 27。但是现在,如果我这样做:
\n\na = 3\nloop do\n b = a * 3\n a += 1\n break if a == 10\nend\nputs b\nRun Code Online (Sandbox Code Playgroud)\n\n我会得到这个:
\n\nundefined local variable or method `b\' for main:Object (NameError)\nRun Code Online (Sandbox Code Playgroud)\n\n这就是你所期待的。这是因为这while是一个声明。while...end可能包含多行代码,但它不算一个块。(同上if。) Butloop实际上是一种将块作为参数的方法,因此 Cary 在他的评论中描述的范围规则适用。
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |