Ruby 中的 for 与 each

Stewart Nguyen 2023年1月30日 2022年5月18日
  1. Ruby 中的 Array#each
  2. Ruby 中的 for..in 循环
Ruby 中的 for 与 each

在 Ruby 中,你可以使用 Array#eachfor..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#eachfor..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