Rubyのeach.with_indexとeach_with_indexの違いは?


93

私は本当に違いについて混乱しているeach.with_indexeach_with_index。タイプは異なりますが、実際には同じように見えます。


6
別に若干の差からwith_indexオフセット開始インデックスを許可する、with_indexと組み合わせて使用される場合、一般的に好ましいがmapreducecollect要するになど、map.with_indexより良好読み出しますeach_with_index.map。ある意味で、と一緒に使用するとmap、存在しないmap_with_indexメソッドの代わりになります。
Cary Swoveland 2013年

回答:


170

この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

41

each_with_index以前にRubyに導入されました。with_index後で導入されました:

  1. さまざまな列挙子で幅広い使用を可能にするため。
  2. インデックスを以外の番号から開始できるようにします0

今日では、with_index一般性と可読性の観点からは使用の方が優れていますが、コードを高速化する観点からは、each_with_indexを使用した方がわずかに高速ですeach.with_index

いくつかのメソッドの単純な連鎖によって単一のメソッドを簡単に表現できると感じた場合、通常、単一のメソッドの方が連鎖よりも高速です。これの別の例としては、reverse_eachよりも速く実行されますreverse.each。これらのメソッドには、存在する理由があります。


1
公平を期すために、オフセットはインデックスを変更せず、インデックスに数値を追加するだけです。呼び出し後にインデックスを確認すると、影響を受けていないことがわかります。いつものように良いメモ、@ sawa
vgoff

2
perfは異なるべきではないと思います(少なくとも実質的には)。このreverse例では、reverseは列挙子ではなく別の配列を返します。列挙子が返された場合、適切な実装があれば遅くなるはずはありません。
akostadinov 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.