回答:
このwith_index
メソッドはオプションのパラメーターを取り、開始インデックスをオフセットします。each_with_index
同じことを行いますが、オプションの開始インデックスはありません。
例えば:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
出力:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
以前にRubyに導入されました。with_index
後で導入されました:
0
。今日では、with_index
一般性と可読性の観点からは使用の方が優れていますが、コードを高速化する観点からは、each_with_index
を使用した方がわずかに高速ですeach.with_index
。
いくつかのメソッドの単純な連鎖によって単一のメソッドを簡単に表現できると感じた場合、通常、単一のメソッドの方が連鎖よりも高速です。これの別の例としては、reverse_each
よりも速く実行されますreverse.each
。これらのメソッドには、存在する理由があります。
reverse
例では、reverse
は列挙子ではなく別の配列を返します。列挙子が返された場合、適切な実装があれば遅くなるはずはありません。
with_index
オフセット開始インデックスを許可する、with_index
と組み合わせて使用される場合、一般的に好ましいがmap
、reduce
、collect
要するになど、map.with_index
より良好読み出しますeach_with_index.map
。ある意味で、と一緒に使用するとmap
、存在しないmap_with_index
メソッドの代わりになります。