each
は、指定された列挙可能オブジェクトを単純に反復処理し、値ごとにブロックを実行します。ブロックの戻り値を破棄し、それぞれが呼び出された元のオブジェクトを返すだけです。
[1, 2, 3].each do |x|
x + 1
end # => [1, 2, 3]
これは、従来の反復for
ループを実行するためのより優れた、より普遍的な方法であり、each
がmuch優先されますRubyのfor
ループを超えます(実際、Rubyでfor
ループを使用したことはないと思います)。
map
ただし、ブロックの戻り値を使用して各要素を反復処理し、それぞれのインデックスに新しい配列を設定して、その新しい配列を返します。
[1, 2, 3].map do |x|
x + 1
end # => [2, 3, 4]
そのため、指定されたブロックを使用して各要素を新しい要素に「マップ」するため、「マップ」という名前が付けられています。 each
もmap
自体も元のコレクションを変更しないことに注意してください。これは、配列を作成して反復ループでプッシュする代わりの、簡潔で機能的な方法です。
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]
_