局部变量可访问的外部块

时间:2019-10-12 05:28:11

标签: ruby scope

我正在阅读有关ruby作用域的信息,它说局部变量在定义它们的块之外不可访问。

例如,在下面的示例中。 b不能在if

之外访问
a = 3
    while a<10 do
        if a<5
            b= 3
        end
        a+=1
    end
puts b

但是由于某些原因,我可以在其定义的块之外访问b

1 个答案:

答案 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在其注释中描述的作用域规则。