Ruby 中 each_with_index 和 each.with_index 的区别

Stewart Nguyen 2023年1月30日 2022年5月18日
  1. Ruby 中的 each_with_index 方法
  2. Ruby 中的 each.with_index 方法
Ruby 中 each_with_index 和 each.with_index 的区别

本教程将演示方法 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]

相关文章 - Ruby Array