对于循环变量范围

时间:2016-02-29 14:50:13

标签: ruby for-loop scope

使用此示例:

arr = [1, 2, 3]

for elem in arr do
  puts elem
end

puts elem # => 3

代码输出:

1
2
3
3

elem甚至包含循环外的值。为什么?循环外的范围是什么?

有人可以澄清吗?

3 个答案:

答案 0 :(得分:8)

这是预期的。根据{{​​3}}:

  

for循环类似于使用each,但不会创建新的变量范围。

for的示例:

for i in 1..3
end
i #=> 3

each的示例:

(1..3).each do |i|
end
i #=> NameError: undefined local variable or method `i'

如果我没弄错的话,方法eachmaploopupto)创建变量范围,而关键字forwhileuntil)不会。

答案 1 :(得分:2)

for语句定义变量elem并使用当前循环的值初始化它。

要避免使用此Array#each

arr.each do |elem|
  puts elem
end
# 1
# 2
# 3
# => [1, 2, 3]
elem
NameError: undefined local variable or method `elem' for main:Object
    from (irb):5
    from /usr/bin/irb:12:in `<main>'

现在,elem变量仅存在于块中。

答案 2 :(得分:0)

您可以在循环范围之外声明变量elem。所以,如果我们修改你的例子:

arr = [1, 2, 3];
elem;

for elem in arr do
  puts elem
end

puts elem # => 3