mapメソッドとは何なのか、どう使えばいいのかを簡単に紹介していきます。
基本的な用途
例えば、以下のような配列があるとします。
numbers = [1, 2, 3]
この配列に収められた数字を、それぞれ2倍にしてみましょう。
単純に考えれば、以下のようなコードが思い浮かぶかもしれません。
doubled_number = numbers * 2
pp doubled_number
しかし、変数doubled_numberの返却値は以下の通りになります。
[1, 2, 3, 1, 2, 3]
数字ではなく、配列の中身そのものが2倍になってしまいました。
それではどうすればいいのか......。
こういう時こそmapメソッドの出番です。
基本的な使い方は以下の通りになります。
'配列'.map {|'配列内の個々の要素'| '指示したい処理内容'}
それでは早速、配列numbersの中に収められた数字をそれぞれ2倍にしてみましょう。
doubled_number = numbers.map {|num| num * 2}
# この場合、numには配列内の数字が一つずつ収められます。
# numはこの場で名づけた変数なので、他の英単語にも置き換えられます。
=>'返却値'
[2, 4, 6]
今度は成功しましたね!
指示したい処理内容が「単一のメソッド呼び出し」の場合
次は、to_sメソッドで配列numbersの各要素を文字列(String型)に変換する場合を考えていきます。
上記のやり方に従っていけば、以下のようなコードができあがるはずです。
numbers = [1, 2, 3]
number_str = numbers.map {|num| num.to_s}
pp number_str
=>'返却値'
["1", "2", "3"]
もちろん上記のコードでも処理の目的は達成できますが、処理内容が「単一のメソッド呼び出し」の場合は、コードをもっと短くすることができるんです。
基本的な使い方はこちら。
'配列'.map(&:'呼び出したいメソッド')
早速、配列numbersに当てはめてみましょう。
number_str = numbers.map(&:to_s)
pp number_str
=>'返却値'
["1", "2", "3"]
配列内の個々の要素をブロック内の変数に置き換える手間が省けましたね!
指示したい処理内容が長い場合
mapメソッドを使っていると、指示したい処理内容が長くなってしまう場面に遭遇します。
例えば、下記のコードの2行目は処理内容のコードが冗長になってしまい、ちょっと読みにくいですよね。
numbers = [1, 2, 3]
defined_numbers = numbers.map {|num| num > 2 ? "#{num * 100}は大きい" : "#{num * 10 }は小さい"}
pp defined_numbers
=>'返却値'
["10は小さい", "20は小さい", "300は大きい"]
こういうときは、do...endのブロックで処理内容を囲むのがおすすめです。
'配列'.map do |'配列内の個々の要素'|
'指示したい処理内容'
end
こちらの式も配列numbersに当てはめてみましょう。
defined_numbers = numbers.map do |num|
num > 2 ? "#{num * 100}は大きい" : "#{num * 10 }は小さい"
end
pp defined_numbers
=>'返却値'
["10は小さい", "20は小さい", "300は大きい"]
改行が入ることで、指示したい処理内容が読みやすくなりました!
状況に応じて式の書き方を使い分けられれば、より読みやすく簡潔なコードを書くことができるようになります。