Ruby 中 each_with_index 和 each.with_index 的區別

Stewart Nguyen 2023年1月30日
  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