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]