Ruby 中 each_with_index 和 each.with_index 的区别
Stewart Nguyen
2023年1月30日
本教程将演示方法 each_with_index
的用法及其与 each.with_index
的区别。
Ruby 中的 each_with_index
方法
我们可能偶尔需要遍历一个数组并知道当前数组元素的索引。
以下是天真的 Ruby 程序员的例子:
array = (0..9).to_a
index = 0
array.each do |num|
# do something
index += 1
end
此代码有效,但不是很好。第一个问题是它增加了两行代码,更多的代码意味着更多的潜在错误。
第二个问题是 index
变量在执行后变成孤立的。如果下面的另一段代码使用相同的变量名,这可能会成为一个问题。
为了解决这个问题,Ruby 有一个名为 each_with_index
的方法,它允许我们在迭代时访问当前元素的索引。
array = ('a'..'e').to_a
array.each_with_index do |char, index|
puts "#{index}: #{char}"
end
输出
0: a
1: b
2: c
3: d
4: e
each_with_index
比使用额外的变量来跟踪当前索引更优雅。它将迭代索引公开为块的第二个参数。
因此,我们不必手动增加索引或留下可能导致严重副作用的孤立变量。
Ruby 中的 each.with_index
方法
Ruby each.with_index
很方便。它接受一个允许索引从 0 以外的数字开始的值。
下面的代码使用 each_with_index
方法。
[1,2,3].each_with_index { |n, index| puts "index: #{index}" }
index: 0
index: 1
index: 2
=> [1, 2, 3]
我们可以使用 each.with_index
方法写出下面的同等代码。
[1,2,3].each.with_index(0) { |n, index| puts "index: #{index}" }
index: 0
index: 1
index: 2
=> [1, 2, 3]
要从 5 开始索引,使用 each.with_index
我们有,
[1,2,3].each.with_index(5) { |n, index| puts "index: #{index}" }
index: 5
index: 6
index: 7
=> [1, 2, 3]