#はじめに
今回はmapメソッドとeachメソッドの使い分けについて考えてみました。
似ているようで似ていない2つの処理について代表的な書き方をまとめましたので、
僕と同じ学習中の方の役に立てればいいと思います。
初心者でもわかりやすいように各文法を日本語で書いてみましたので、当てはめるだけで書くことが出来ます。
##mapメソッド
** 配列名.map { | 要素名 | 処理 }**
配列の各要素に対してブロックで処理を行い結果を配列として返してくれます。
処理の時だけ結果を返してくれて、その後は元の配列のままです。
# mapメソッド
numbers1 = [1, 2, 3, 4, 5]
p numbers1.map{|number| number * 2}
#=> [2, 4, 6, 8, 10] *処理の時だけ
p numbers1
#=> [1, 2, 3, 4, 5] *元の配列に影響は無い
array = ["1", "2", "3", "4", "5"]
p array.map(&:to_i) #=>[1, 2, 3, 4, 5] *処理の時だけ
p array #=> ["1", "2", "3", "4", "5"] *元の配列に影響は無い
** 配列名.map! { | 要素名 | 処理 }**
配列の各要素に対してブロックで処理を行い結果を配列として返してくれます。
配列の要素を置き換えてくれます。
# mapメソッド
numbers1 = [1, 2, 3, 4, 5]
p numbers1.map!{|number| number * 2}
#=> [2, 4, 6, 8, 10] *破壊的メソッド
p numbers1
#=> [2, 4, 6, 8, 10] *配列の要素に処理が上書きされる
array = ["1", "2", "3", "4", "5"]
p array.map!(&:to_i) #=> [1, 2, 3, 4, 5] *破壊的メソッド
p array #=> [1, 2, 3, 4, 5] *配列の要素に処理が上書きされる
##eachメソッド
配列名.each do |要素名|
処理
end
配列の各要素を1つずつ取り出し処理を行います。イメージとしては配列名から要素を取り出し要素名に代入して処理というような感じになります。
# eachメソッド
numbers1 = [1, 2, 3, 4, 5]
numbers1.each do |number|
p number * 2
end
#=> 2
# 4
# 6
# 8
# 10
mapメソッドと同じように処理結果を配列として取り出すには下記のように、
空の配列を用意し代入して出力しなくてはならない。
numbers1 = [1, 2, 3, 4, 5]
numbers2 = []
numbers1.each do |number|
numbers2 << number * 2
end
p numbers2
#=> [2, 4, 6, 8, 10]
##まとめ
- 繰り返し処理を行うなら eachメソッド
- 繰り返し処理結果を配列として扱うなら mapメソッド
- mapメソッドは破壊的メソッドも使える
間違いなど、ご指摘いただければ幸いです。