web-dev-qa-db-ja.com

地図とそれぞれの違い

重複の可能性:
Ruby-マップ、それぞれと収集の違いは何ですか?

Ruby-Docも調べましたが、違いがわかりません

map
each

イテレータ。例を挙げて説明していただければ幸いです。

26
user1065734

each は、指定された列挙可能オブジェクトを単純に反復処理し、値ごとにブロックを実行します。ブロックの戻り値を破棄し、それぞれが呼び出された元のオブジェクトを返すだけです。

[1, 2, 3].each do |x|
  x + 1
end  # => [1, 2, 3]

これは、従来の反復forループを実行するためのより優れた、より普遍的な方法であり、eachmuch優先されますRubyのforループを超えます(実際、Rubyでforループを使用したことはないと思います)。


map ただし、ブロックの戻り値を使用して各要素を反復処理し、それぞれのインデックスに新しい配列を設定して、その新しい配列を返します。

[1, 2, 3].map do |x|
  x + 1
end  # => [2, 3, 4]

そのため、指定されたブロックを使用して各要素を新しい要素に「マップ」するため、「マップ」という名前が付けられています。 eachmap自体も元のコレクションを変更しないことに注意してください。これは、配列を作成して反復ループでプッシュする代わりの、簡潔で機能的な方法です。

73
Andrew Marshall

eachは元のオブジェクトを返します。これは、結果を収集せずに、配列の各要素を使用して操作を実行するために使用されます。たとえば、番号のリストを印刷する場合は、次のようにします。

_arr = [1, 2, 3, 4]
arr.each { |n| puts n }
_

さて、上記のputsメソッドは実際にはnilを返します。それを知らない人もいますが、とにかくそれはそれほど重要ではありません。その値を収集する本当の理由はありません(arrを文字列に変換する場合は、arr.map(&:to_s)または_arr.map { |n| n.to_s }_を使用する必要があります。


mapは、渡したブロックの結果を返します。これは、配列内の各要素に対して操作を実行するための優れた方法ですそして結果を取得します。配列のすべての要素を2倍にしたい場合は、これが自然な選択です。ボーナスとして、_map!_を使用して元のオブジェクトを変更できます。例えば:

_arr = [1, 2, 3, 4]
arr.map! { |n| n * 2}
# => [2, 4, 6, 8]
_
7
brymck