PR

Rubyのmapメソッドを使った配列操作の基本的な書き方

Ruby・Rails

プログラミングにおいて配列の操作は非常に重要な基礎スキルです。特にRubyのmapメソッドは、配列の要素を効率的に変換できる強力な機能です。この記事では、mapメソッドの基礎から実践的な使い方まで、初心者の方にも分かりやすく解説していきます。

mapメソッドとは

mapメソッドは、配列の各要素に対して同じ処理を適用し、その結果を新しい配列として返すメソッドです。たとえば、数値の配列のすべての要素を2倍にしたい場合や、文字列の配列のすべての要素を大文字に変換したい場合などに便利です。

基本的な使い方

最も単純な例から見ていきましょう:

numbers = [1, 2, 3, 4, 5]
doubled = numbers.map { |number| number * 2 }
puts doubled  # => [2, 4, 6, 8, 10]

このコードでは:

  • numbersという配列の各要素に対して
  • ブロック内の処理(number * 2)を実行し
  • 結果を新しい配列として返しています

実践的な使用例

文字列の変換

names = ['alice', 'bob', 'carol']
capitalized = names.map { |name| name.capitalize }
puts capitalized  # => ["Alice", "Bob", "Carol"]

複数の値を含む配列の処理

users = [
  { name: '田中', age: 25 },
  { name: '鈴木', age: 30 },
  { name: '佐藤', age: 35 }
]

user_names = users.map { |user| user[:name] }
puts user_names  # => ["田中", "鈴木", "佐藤"]

高度な使い方

メソッドの省略記法

シンプルな変換の場合、ブロックの代わりにシンボルを使用できます:

# 通常の書き方
words = ['hello', 'world', 'ruby']
upcased = words.map { |word| word.upcase }

# シンボルを使った省略記法
upcased = words.map(&:upcase)

puts upcased  # => ["HELLO", "WORLD", "RUBY"]

条件分岐を含む処理

mapメソッド内で条件分岐を使用することもできます:

numbers = [1, 2, 3, 4, 5]
result = numbers.map do |n|
  if n.even?
    "#{n}は偶数です"
  else
    "#{n}は奇数です"
  end
end

puts result
# => ["1は奇数です", "2は偶数です", "3は奇数です", "4は偶数です", "5は奇数です"]

実務での活用例

データの整形

APIから取得したデータを整形する例:

raw_data = [
  { "user_id" => 1, "name" => "田中太郎", "age" => "25" },
  { "user_id" => 2, "name" => "鈴木花子", "age" => "30" },
  { "user_id" => 3, "name" => "佐藤次郎", "age" => "35" }
]

formatted_data = raw_data.map do |user|
  {
    id: user["user_id"],
    name: user["name"],
    age: user["age"].to_i,
    adult: user["age"].to_i >= 20
  }
end

計算処理

商品の価格計算などでよく使用される例:

products = [
  { name: "商品A", price: 1000 },
  { name: "商品B", price: 2000 },
  { name: "商品C", price: 1500 }
]

# 税込価格の計算
tax_included_products = products.map do |product|
  {
    name: product[:name],
    price: product[:price],
    tax_included_price: (product[:price] * 1.1).round
  }
end

mapメソッドと他のメソッドの組み合わせ

selectとmapの組み合わせ

条件に合う要素だけを抽出して変換する場合:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 偶数だけを抽出して2倍にする
result = numbers.select(&:even?).map { |n| n * 2 }
puts result  # => [4, 8, 12, 16, 20]

flattenとの組み合わせ

入れ子になった配列を平坦化する場合:

users = [
  { name: '田中', hobbies: ['読書', '映画'] },
  { name: '鈴木', hobbies: ['料理', 'スポーツ'] }
]

all_hobbies = users.map { |user| user[:hobbies] }.flatten
puts all_hobbies  # => ["読書", "映画", "料理", "スポーツ"]

エラー処理とmapメソッド

実践的なコードでは、エラー処理を組み込むことが重要です:

def safe_transform(items)
  items.map do |item|
    begin
      yield(item)
    rescue => e
      puts "エラーが発生しました: #{e.message}"
      nil
    end
  end.compact
end

# 使用例
numbers = ['1', '2', 'three', '4', '5']
result = safe_transform(numbers) { |n| Integer(n) }
puts result  # => [1, 2, 4, 5]

パフォーマンスの考慮

メモリ使用の最適化

大きな配列を処理する場合は、メモリ使用に注意が必要です:

# メモリを多く使う方法
large_array = (1..1000000).to_a
result = large_array.map { |n| n * 2 }

# メモリ効率の良い方法(必要に応じて)
result = []
large_array.each { |n| result << n * 2 }

まとめと実践的なアドバイス

mapメソッドを効果的に使用するためのポイント:

  1. シンプルな変換には省略記法を使う
   names.map(&:upcase)
  1. 複雑な変換にはブロックを使う
   users.map do |user|
     {
       full_name: "#{user[:first_name]} #{user[:last_name]}",
       age: user[:age]
     }
   end
  1. チェーンメソッドを適切に使う
   users
     .select { |u| u[:age] >= 20 }
     .map { |u| u[:name] }
     .map(&:upcase)
  1. エラー処理を忘れずに
   results = items.map do |item|
     begin
       process_item(item)
     rescue => e
       log_error(e)
       nil
     end
   end.compact

mapメソッドは、Rubyプログラミングにおいて最も頻繁に使用されるメソッドの1つです。基本的な使い方をマスターし、徐々に高度な使い方にチャレンジしていくことで、より効率的で読みやすいコードが書けるようになります。

特に初心者の方は、まずは単純な変換から始めて、実際のプロジェクトで使用されている例を参考にしながら、スキルを向上させていくことをお勧めします。

タイトルとURLをコピーしました