基礎

Rubyのeachメソッド入門|配列・ハッシュの繰り返し処理を徹底解説

eachメソッドはRubyで最も頻繁に使われる繰り返し処理の方法です。配列やハッシュなどのコレクションの各要素に対して、ブロック内の処理を順番に実行します。for文よりもRubyらしい書き方として広く使われており、Ruby開発者にとって必須の知識です。

基本的な使い方

配列のeach

配列の各要素をブロック変数に代入しながら、ブロック内の処理を繰り返します。

Ruby
fruits = ['りんご', 'バナナ', 'みかん']

fruits.each do |fruit|
  puts "果物: #{fruit}"
end
実行結果
果物: りんご
果物: バナナ
果物: みかん

do...endがブロックで、|fruit|がブロック変数です。配列の各要素が順番にfruitに代入され、ブロック内の処理が実行されます。

波括弧を使った記法

1行で書ける場合は波括弧{}を使います。

Ruby
numbers = [1, 2, 3, 4, 5]

# 1行の場合は波括弧
numbers.each { |n| puts n * 2 }
実行結果
2
4
6
8
10

慣例として、複数行の場合はdo...end、1行の場合は{}を使います。

each_with_indexでインデックス付き

要素と一緒にインデックス番号も取得したい場合はeach_with_indexを使います。

Ruby
colors = ['赤', '青', '緑', '黄']

colors.each_with_index do |color, index|
  puts "#{index + 1}番目: #{color}"
end
実行結果
1番目: 赤
2番目: 青
3番目: 緑
4番目: 黄

ハッシュのeach

ハッシュに対してeachを使うと、キーと値の両方をブロック変数で受け取れます。

Ruby
user = {name: '太郎', age: 25, city: '東京'}

user.each do |key, value|
  puts "#{key}: #{value}"
end

puts '---'

# キーだけ、値だけの繰り返しも可能
user.each_key { |k| print "#{k} " }
puts ''
user.each_value { |v| print "#{v} " }
puts ''
実行結果
name: 太郎
age: 25
city: 東京
---
name age city 
太郎 25 東京 

eachと関連メソッド

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

# map: 各要素を変換した新しい配列を返す
doubled = numbers.map { |n| n * 2 }
puts "2倍: #{doubled.inspect}"

# select: 条件に合う要素だけ抽出
evens = numbers.select { |n| n.even? }
puts "偶数: #{evens.inspect}"

# reject: 条件に合わない要素を抽出
odds = numbers.reject { |n| n.even? }
puts "奇数: #{odds.inspect}"

# find: 最初に条件に合う要素を返す
first_over_5 = numbers.find { |n| n > 5 }
puts "5より大きい最初の値: #{first_over_5}"

# count: 条件に合う要素数を返す
over_5_count = numbers.count { |n| n > 5 }
puts "5より大きい要素数: #{over_5_count}"
実行結果
2倍: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
偶数: [2, 4, 6, 8, 10]
奇数: [1, 3, 5, 7, 9]
5より大きい最初の値: 6
5より大きい要素数: 5

実践的な使い方

Ruby
# 売上データの集計
sales = [
  {product: 'ノートPC', quantity: 3, price: 89800},
  {product: 'マウス', quantity: 15, price: 2980},
  {product: 'キーボード', quantity: 8, price: 7980},
  {product: 'モニター', quantity: 5, price: 34800}
]

puts '--- 売上明細 ---'
total_revenue = 0

sales.each do |sale|
  revenue = sale[:quantity] * sale[:price]
  total_revenue += revenue
  puts "#{sale[:product]}: #{sale[:quantity]}個 x #{sale[:price]}円 = #{revenue}円"
end

puts "\n総売上: #{total_revenue}円"

# 売上が10万円以上の商品
high_sales = sales.select { |s| s[:quantity] * s[:price] >= 100000 }
puts "\n高売上商品:"
high_sales.each { |s| puts "  #{s[:product]}" }
実行結果
--- 売上明細 ---
ノートPC: 3個 x 89800円 = 269400円
マウス: 15個 x 2980円 = 44700円
キーボード: 8個 x 7980円 = 63840円
モニター: 5個 x 34800円 = 174000円

総売上: 551940円

高売上商品:
  ノートPC
  モニター
eachとmapの使い分け

eachは各要素に対して処理を実行するだけで、戻り値は元のコレクションです。mapは各要素を変換した新しい配列を返します。「処理するだけ」ならeach、「変換した結果が欲しい」ならmapを使いましょう。

eachの戻り値に注意

eachは元の配列・ハッシュをそのまま返します。「各要素を2倍にした配列が欲しい」場合にeachを使うと元の配列が返ってしまいます。変換結果が必要な場合はmapを使いましょう。

まとめ

  • eachは配列やハッシュの各要素に対して処理を繰り返す
  • each_with_indexでインデックス番号も取得できる
  • ハッシュのeachではキーと値の両方をブロック変数で受け取れる
  • mapselectrejectなど用途に応じたメソッドがある
  • Rubyではfor文よりもeachが推奨されている