Ruby 中的 for 与 each
Stewart Nguyen
2023年1月30日
2022年5月18日
在 Ruby 中,你可以使用 Array#each
和 for..in
来遍历数组。但是,两者之间存在显着差异。
Ruby 中的 Array#each
Ruby Array#each
方法是最直接且广泛使用的迭代数组中单个项目的方法。
each
是 Array 类的内置方法,它是最流行的迭代 Ruby 数组中项目的方法。
each
将块作为参数并返回当前项。
[1, 2, 3].each { |n| puts n }
输出:
1
2
3
Ruby 中的 for..in
循环
与大多数其他编程语言一样,Ruby 有一个用于循环数组的 for
语句。
for
后跟一个作为当前元素的变量和一个迭代数组。
for n in [1, 2, 3]
puts n
end
输出:
1
2
3
在引擎盖下,Array#each
和 for..in
几乎做同样的事情。但是,有一个微小的差异,可能会导致严重的问题。
[1, 2, 3].each { |n| n }
puts n
输出:
NameError (undefined local variable or method `n' for main:Object)
代码示例:
for n in [1, 2, 3]
n
end
puts n
输出:
3
如果我们尝试在 Array#each
之后打印 n
,我们会得到一个错误,但它会在 for
循环之后打印 3
。
这是怎么回事?
在执行 for..in
之前,变量 n
是预先定义的。块完成后,它在块外仍然可见。
换句话说,for
循环类似于:
n = nil
[1, 2, 3].each { |i| n = i }
puts n
输出:
3
在 Array#each
的情况下,变量 n
定义在块 { |n| puts n }
,因此它对块范围之外的任何东西都不可见。
使用 for
循环可能会引入额外的变量作为副作用,从而导致令人沮丧的问题。结果,Array#each isprefered 胜过 for..in
。