局部变量可在块外部访问

Ved*_*tty 2 ruby scope

我正在阅读有关 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它定义的块的外部

Bob*_*des 5

在 Ruby 中,“块”基本上是包含在大括号内do...end或花括号之间的代码。(还有其他方法 \xe2\x80\x94 类似于 \xe2\x80\x94 在 Ruby 中创建块,但这个定义会让你花很长一段时间。)if...end不被视为块。既不是while...end。使问题进一步复杂化的是,do您在 后面添加的while也不会使其成为一个块;Ruby 只是忽略了它。

\n\n

卡里已经在评论中解释了这一点,但我会看看是否可以为您澄清一下。我将稍微简化和清理您的代码:

\n\n
a = 3\nwhile a < 10\n  b = a * 3 \n  a += 1\nend\nputs b\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将给出 27。但是现在,如果我这样做:

\n\n
a = 3\nloop do\n  b = a * 3\n  a += 1\n  break if a == 10\nend\nputs b\n
Run Code Online (Sandbox Code Playgroud)\n\n

我会得到这个:

\n\n
undefined local variable or method `b\' for main:Object (NameError)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是你所期待的。这是因为这while是一个声明。while...end可能包含多行代码,但它不算一个块。(同上if。) Butloop实际上是一种将块作为参数的方法,因此 Cary 在他的评论中描述的范围规则适用。

\n