配列.map / collect
| 対応: | Ruby 1.8(2003) |
|---|
配列の各要素にブロックの処理を適用し、結果を新しい配列として返すメソッドです。元の配列は変更されません。
構文
# 各要素を変換した新しい配列を返します。
配列.map { |要素| 処理 }
配列.collect { |要素| 処理 } # map の別名
# 破壊的バージョン(元の配列を直接変更します)。
配列.map! { |要素| 処理 }
配列.collect! { |要素| 処理 }
メソッド一覧
| メソッド | 概要 |
|---|---|
| map { |e| } | 各要素にブロックを適用した結果の新しい配列を返します。元の配列は変更されません。 |
| collect { |e| } | 『map』の別名です。動作はまったく同じです。 |
| map! { |e| } | 各要素をブロックの戻り値で置き換えます。元の配列を直接変更する破壊的メソッドです。 |
| collect! { |e| } | 『map!』の別名です。 |
サンプルコード
sample_array_map_collect.rb
numbers = [1, 2, 3, 4, 5]
# 各要素を2倍にした新しい配列を作ります。
doubled = numbers.map { |n| n * 2 }
puts doubled.inspect # [2, 4, 6, 8, 10]
puts numbers.inspect # [1, 2, 3, 4, 5](元の配列は変わりません)
# 文字列に変換します。
labels = numbers.map { |n| "#{n}番" }
puts labels.inspect # ["1番", "2番", "3番", "4番", "5番"]
# シンボル &:メソッド名 でも書けます。
words = ["hello", "world", "ruby"]
upcased = words.map(&:upcase)
puts upcased.inspect # ["HELLO", "WORLD", "RUBY"]
# map! で元の配列を変更します。
scores = [60, 70, 80, 90]
scores.map! { |s| s + 5 }
puts scores.inspect # [65, 75, 85, 95]
# ハッシュを生成するときにも便利です。
names = ["五条悟", "両面宿儺", "虎杖悠仁"]
length_map = names.map { |name| [name, name.length] }.to_h
puts length_map.inspect # {"五条悟"=>3, "両面宿儺"=>4, "虎杖悠仁"=>4}
ruby array_map_collect.rb
[2, 4, 6, 8, 10]
[1, 2, 3, 4, 5]
["1番", "2番", "3番", "4番", "5番"]
["HELLO", "WORLD", "RUBY"]
[65, 75, 85, 95]
{"五条悟"=>3, "両面宿儺"=>4, "虎杖悠仁"=>4}
概要
『map』は配列の変換操作で最もよく使われるメソッドです。ブロックの戻り値が新しい配列の要素になります。『collect』は『map』の別名であり、どちらを使っても動作は同一です。Rubyコミュニティでは『map』が一般的に好まれます。
『&:メソッド名』の記法はシンボルの『to_proc』機能を利用したもので、各要素にそのメソッドを呼び出す処理を簡潔に書けます。詳しくは『シンボル.to_s / to_proc』を参照してください。
破壊的な『map!』はブロックが『nil』を返した場合にも要素が『nil』で置き換えられるため、意図しない『nil』が混入しないよう注意してください。
条件に一致する要素だけを取り出す場合は『select / filter / reject』を、変換と絞り込みを同時に行う場合は『flat_map / filter_map』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。