Rubyでプログラミングを行う際、データの集合を順番に処理する「繰り返し処理」は非常に重要な役割を果たします。

Rubyにはいくつかのループ処理が用意されていますが、その中でももっとも基本的かつ強力なメソッドが each です。

each メソッドを正しく理解し使いこなすことで、コードの可読性を高め、効率的な開発が可能になります。

本記事では、each メソッドの基本的な使い方から、配列やハッシュでの応用、さらには他のメソッドとの違いまで詳しく紹介します。

Rubyのeachメソッドとは

each メソッドは、配列やハッシュなどのオブジェクトに含まれる要素を、一つずつ取り出して繰り返し処理を行うためのメソッドです。

Rubyにおいて繰り返し処理を記述する場合、for 文よりも each メソッドを使用することが推奨されています。

これは、each メソッドが「イテレータ」と呼ばれる仕組みを利用しており、Rubyらしい簡潔な記述ができるためです。

まずは、もっとも基本的な構文を確認しましょう。

Ruby
# 基本的な構文
オブジェクト.each do |変数|
  # 繰り返したい処理
end

このように、do ... end のブロック内に処理を記述し、|変数| の部分で取り出した要素を受け取ります。

配列(Array)での基本的な使い方

もっとも一般的な each メソッドの使い方は、配列の要素を順番に処理することです。

以下のサンプルコードでは、数値が入った配列から一つずつ値を取り出して出力しています。

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

# 配列の要素を一つずつ出力する
numbers.each do |n|
  puts "現在の数値は #{n} です"
end
実行結果
現在の数値は 1 です
現在の数値は 2 です
現在の数値は 3 です
現在の数値は 4 です
現在の数値は 5 です

このように、配列 numbers の中身が順番に変数 n に代入され、ブロック内の puts 処理が実行されます。

また、処理が1行で済む場合は、do ... end の代わりに { ... } を使うことも一般的です。

Ruby
numbers = [1, 2, 3]
numbers.each { |n| puts n * 10 }
実行結果
10
20
30

ハッシュ(Hash)でのeachメソッドの使い方

Rubyの each メソッドは、配列だけでなくハッシュに対しても使用できます。

ハッシュの場合、「キー」と「値」のセットを一度に取り出すことができます。

Ruby
user_info = { name: "田中", age: 25, address: "東京都" }

# キーと値をそれぞれ変数に受け取る
user_info.each do |key, value|
  puts "#{key} は #{value} です"
end
実行結果
name は 田中 です
age は 25 です
address は 東京都 です

ブロック変数として |key, value| のように二つの変数を指定するのがポイントです。

もし変数一つだけを指定した場合、その変数には [キー, 値] という配列の形で渡されます。

キーのみ、または値のみをループさせる

ハッシュの処理において、キーだけ、あるいは値だけが必要な場合は専用のメソッドを組み合わせるのが効率的です。

以下のコードは、each_keyeach_value を使用した例です。

Ruby
fruits = { apple: 100, banana: 200, orange: 150 }

# キーだけを取り出す
fruits.each_key do |key|
  puts "商品名: #{key}"
end

# 値だけを取り出す
fruits.each_value do |price|
  puts "価格: #{price}円"
end

範囲オブジェクト(Range)でのeachメソッド

特定の回数だけ処理を繰り返したい場合や、連続する数値を扱いたいときには「範囲オブジェクト」に対して each を使います。

(1..5) のように記述することで、1から5までの数値を順番に処理できます。

Ruby
(1..3).each do |i|
  puts "#{i}回目の処理です"
end
実行結果
1回目の処理です
2回目の処理です
3回目の処理です

わざわざ [1, 2, 3] という配列を作成する必要がないため、非常にスマートに記述できます。

eachメソッドと他のメソッドの使い分け

Rubyには each 以外にも便利な反復メソッドが多く存在します。

特に混同しやすい mapfor との違いを整理しておきましょう。

each と map の違い

each ともっともよく比較されるのが map メソッドです。

どちらも繰り返し処理を行いますが、「戻り値」に大きな違いがあります。

メソッド主な目的戻り値
each各要素に対して何か処理(出力や保存など)を行う元のオブジェクト(レシーバ)自身
map各要素を変換して新しい配列を作成する各要素の処理結果を含む新しい配列
Ruby
numbers = [1, 2, 3]

# eachは元の配列を返す(処理自体が目的)
res_each = numbers.each { |n| n * 2 }
p res_each #=> [1, 2, 3]

# mapは計算結果の新しい配列を返す
res_map = numbers.map { |n| n * 2 }
p res_map #=> [2, 4, 6]

単に画面に出力したりDBに保存したりする場合は each を使い、元のデータを加工して新しいリストを作りたい場合は map を選ぶのが適切です。

each と for 文の違い

Rubyには他の言語と同様に for 文も存在しますが、現場で使われることは稀です。

その最大の理由は、「変数のスコープ」の違いにあります。

Ruby
# for文の場合、ループ後も変数が残る
for i in [1, 2, 3] do
  j = i
end
p j #=> 3 (参照できてしまう)

# eachの場合、ブロック内の変数は外から参照できない
[1, 2, 3].each do |k|
  l = k
end
# p l #=> エラー(NameError)になる

each を使うことで、意図しない変数の上書きやバグを防ぐことができるため、Rubyでは each の使用が推奨されています。

eachメソッドをさらに便利に使うテクニック

応用的な使い方として、インデックス番号(添字)を一緒に取得する方法があります。

これには each_with_index メソッドを使用します。

Ruby
names = ["田中", "佐藤", "鈴木"]

# 要素と一緒にインデックス番号(0から始まる)を受け取る
names.each_with_index do |name, i|
  puts "#{i + 1}番目は #{name} さんです"
end
実行結果
1番目は 田中 さんです
2番目は 佐藤 さんです
3番目は 鈴木 さんです

何番目の要素を処理しているかを把握したい場合には非常に便利なメソッドです。

まとめ

Rubyの each メソッドは、配列やハッシュ、範囲オブジェクトなどのコレクションを扱う上でもっとも基礎的なメソッドです。

do ... end ブロックを活用することで、非常に読みやすく直感的なコードを書くことができます。

for 文とのスコープの違いや、map メソッドとの戻り値の違いを意識して使い分けることが、脱初心者の第一歩となります。

本記事で紹介した基本をマスターして、よりスマートなRubyコーディングを目指しましょう。

日々の開発の中で、まずは each を使ったシンプルなループ処理から書き慣れていくことをおすすめします。