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ではキーと値の両方をブロック変数で受け取れる
map、select、rejectなど用途に応じたメソッドがある- Rubyではfor文よりもeachが推奨されている