ruby - block 外部可访问的局部变量

标签 ruby scope

我正在阅读有关 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/

相关文章:

ruby-on-rails - 以任意顺序匹配多个 yield

python - 查找在 : Block 中定义的函数

javascript - 如何到达内联 javascript 回调函数的父作用域?

ruby - 我如何在 Ruby 中组合 gets.chomp 和 ARGV?

ruby - 如何使用将文件发送到服务器的 HTTParty (Net::HTTP) 发送 POST 请求

ruby-on-rails - 可以访问_by

javascript - 将回调函数传递给 d3.xml?

javascript - if 语句是否创建局部作用域?

ruby - 使用 Nokogiri 从链接获取 href 时无法将字符串转换为整数

ruby - 如何使用 Nokogiri 从 xml 中提取属性名称和值对?