使用此示例:
arr = [1, 2, 3]
for elem in arr do
puts elem
end
puts elem # => 3
代码输出:
1
2
3
3
elem
甚至包含循环外的值。为什么?循环外的范围是什么?
有人可以澄清吗?
答案 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'
如果我没弄错的话,方法(each
,map
,loop
,upto
)创建变量范围,而关键字(for
,while
,until
)不会。
答案 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