回答:
この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メソッドの代わりになります。