5

Enumerable#eachとの違いEnumerable#mapは、レシーバーを返すか、マップされた結果を返すかです。レシーバーに戻るのは些細なことであり、通常はeachlikeの後にメソッドチェーンを続ける必要はありませんeach{...}.another_method(私はおそらくそのようなケースを見たことがありません。レシーバーに戻りたい場合でも、 でそれを行うことができますtap)。したがって、 が使用されているすべてまたはほとんどの場合Enumerable#eachは に置き換えることができると思いますEnumerable#map。私が間違っている?私が正しければ、の目的はeach何ですか? mapよりも遅いですeachか?

編集each:戻り値に興味がない場合に使用する一般的な方法があることを知っています。私はそのような慣習が存在するかどうかには興味がありませんが、そのような慣習が慣習の観点から以外に意味があるかどうかに興味があります.

4

4 に答える 4

6

との違いはmapeach一方が新しい配列を返し、もう一方が返さないかどうかよりも重要です。重要な違いは、意図を伝える方法にあります。

を使用するeachと、コードは「各要素に対して何かを実行しています」と言う。を使用するmapと、コードは「各要素を変換して新しい配列を作成しています」と言います。

mapしたがって、代わりに を使用することはできますがeach、パフォーマンスに関係なく、コードを読んでいる人にその意図について嘘をついていることになります。

于 2012-09-30T12:09:17.583 に答える
5

mapまたはの選択はeach、目的の最終結果 (新しい配列を作成するか、新しい配列を作成しないか) によって決定する必要があります。の結果は、map 巨大またはばかげたものになる可能性があります。

p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's
于 2012-09-30T10:15:05.880 に答える
2

私はあなたが言ったことに同意します。Enumerable#each単純に、呼び出された元のオブジェクトを返し、Enumerable#map反復処理中の現在の要素をブロックの戻り値に設定し、それらの変更を含む新しいオブジェクトを返します。

単純に元のオブジェクト自体を返すため、要素を単純に反復またはトラバースする必要がある場合にはEnumerable#each、 よりも非常に適しています。map

実際、Enumerable#each従来の反復 for ループを実行するシンプルで普遍的な方法であり、それぞれが Ruby の for ループよりもはるかに好まれています。

于 2012-09-30T07:51:47.123 に答える
0

これらの列挙子を構成しているmapとの大きな違いがわかります。each

たとえば、インデックスを含む新しい配列を取得する必要があります。

array.each.with_index.map { |index, element| [index, element] }

または、たとえば、配列内のすべての要素にいくつかのメソッドを適用し、元の配列を変更せずに結果を出力する必要があります。

m = 2.method(:+)

[1,2,3].each { |a| puts m.call(a) } #=> prints 3, 4, 5

eachそして、関数型スタイルでコードを書く際にとの違いmapが重要な鍵となる例は他にもたくさんあります。

于 2012-09-30T13:10:51.950 に答える