導入
配列の全要素を加工した新しい配列を作りたい、あるいは条件に合う要素だけを集めたい――そんなときに使うのが map と select/reject です。each と違い、新しい配列を返すのが特徴です。
説明
map はブロックの結果を集めた新しい配列を作ります。
numbers = [1, 2, 3, 4, 5]
doubled = numbers.map { |n| n * 2 }
puts doubled.inspect
select は条件(ブロックが true になるもの)に合う要素だけを集めます。reject はその逆で、条件に合わない要素だけを集めます。
evens = numbers.select { |n| n.even? }
puts evens.inspect
odds = numbers.reject { |n| n.even? }
puts odds.inspect
.even? は偶数かどうかを判定するメソッドです(奇数なら .odd?)。? で終わるメソッドは true/false を返す習慣があります。ブロックは do..end の代わりに { } で書くこともでき、1行で済む短いブロックでは { } がよく使われます。
やってみよう
map のブロックの中身を変えて、n * n(2乗)や n + 10 のような別の加工を試してみましょう。
演習
配列 nums = [1, 2, 3, 4] を map で3倍した配列にして、.inspect で表示してください([3, 6, 9, 12])。
ヒント1を見る
nums.map { |n| n * 3 } の結果を変数に入れて .inspect で表示します。
ヒント2を見る
puts nums.map { |n| n * 3 }.inspect のように直接つなげてもよいです。