eachメソッドで配列の要素を順番に処理しよう

学習の目標

本章では、以下の内容を学習します。

  • eachメソッドの基本的な使い方を理解する
  • ブロックとブロック変数の概念をマスターする
  • eachメソッドを使った実践的な配列処理を習得する
  • with_indexメソッドを使ってインデックス番号を扱う方法を学ぶ
  • ブロックの異なる記法とその使い分けを理解する

はじめに

プログラミングを行う上で、配列(リスト)のデータを扱うことは非常に多いです。商品のリストを表示したり、ユーザーのデータを処理したり、計算を行ったりする際には、配列の各要素に対して同じ処理を繰り返し行う必要があります。

Rubyでは、このような「配列の要素を1つずつ処理する」という操作を簡単に行うためのeachメソッドが用意されています。eachメソッドを使いこなせるようになると、データ処理のコードがとても簡潔に書けるようになります。

それでは、具体的な例を見ながらeachメソッドの使い方を一緒に学んでいきましょう。

eachメソッドの基本

まずは、eachメソッドの基本的な使い方を見てみましょう。each.rbというファイルを作成し、以下のコードを書いてみてください。

numbers = [1, 2, 3]
numbers.each do |number|
puts number
end

このプログラムを実行すると、以下のように配列の中の数字が順番に表示されます。

1
2
3

このプログラムでは、以下のことが行われています。

  1. numbersという配列に[1, 2, 3]という3つの数値を格納
  2. eachメソッドを使って、配列の各要素に対して繰り返し処理を実行
  3. 配列の各要素が順番にnumberという変数に代入され、puts numberで画面に表示

eachメソッドの働きを詳しく見ていきましょう。

ブロックとブロック変数

eachメソッドでは、繰り返し実行したい処理をブロックと呼ばれる部分に記述します。ブロックはdoendで囲まれた部分、または波括弧{}で囲まれた部分です。

# doとendで囲まれたブロック
numbers.each do |number|
puts number
end

ブロックの中で、配列の各要素を受け取るための変数をブロック変数と呼びます。上の例では|number|の部分がブロック変数です。この変数に、配列の各要素が順番に代入されていきます。

配列に3つの要素があれば、ブロックの中の処理も3回実行されることになります。その際、ブロック変数numberには以下のように値が代入されます。

1回目: number = 1 2回目: number = 2 3回目: number = 3

このようにeachメソッドを使うと、配列の各要素に対して同じ処理を簡単に繰り返し実行できます。

ブロック変数の活用

ブロック変数は、その時々の要素を表す変数なので、プログラムの内容に合わせて適切な名前を付けることができます。例えば、商品名のリストを処理する場合は、次のようにわかりやすい名前を付けるとよいでしょう。

items = ["コーヒー", "紅茶", "ほうじ茶"]
items.each do |item|
puts "#{item}が注文されました"
end

このプログラムを実行すると、以下のように表示されます。

コーヒーが注文されました
紅茶が注文されました
ほうじ茶が注文されました

ブロック変数の名前は自由に付けられますが、以下のような慣習があります。

  • 配列の要素が一つのオブジェクトなら単数形の名前(item, number, userなど)
  • 処理の内容が伝わる名前(priceなら価格を表すことが伝わる)
  • シンプルで短い名前(一般的には1〜2単語程度)

適切な名前を付けることで、コードの読みやすさが大幅に向上します。

ブロック内での計算

ブロックの中では、通常の変数と同じようにブロック変数を使った計算も行えます。例えば、配列内の数値の合計を計算する例を見てみましょう。

prices = [100, 200, 300]
total = 0
prices.each do |price|
total += price
end
puts "合計金額は#{total}円です"

このプログラムを実行すると、以下のように表示されます。

合計金額は600円です

この例では、以下のことが行われています。

  1. prices配列に商品の価格を格納
  2. total変数を0で初期化
  3. eachメソッドで配列の各要素を処理
  4. 各要素(価格)をtotal変数に加算
  5. 最終的な合計金額を表示

このように、ブロック内で計算を行い、ブロック外の変数を更新することも可能です。配列の要素を集計したり加工したりする処理によく使われる方法です。

ブロックの別の書き方

Rubyでは、ブロックを書く方法として、do...endの他に波括弧{...}を使う方法もあります。

numbers = [1, 2, 3]
numbers.each { |number| puts number }

この2つの書き方は基本的に同じ働きをしますが、一般的には以下のような使い分けがされています。

  • do...endを使う場合:複数行にわたる処理や、複雑な処理を書く場合
  • {...}を使う場合:1行で収まるような簡単な処理を書く場合

どちらの書き方を選んでも機能的には同じですが、Rubyのコミュニティでは上記のような慣習があります。コードの読みやすさを考慮して適切な方を選ぶとよいでしょう。

インデックス番号を使う

配列の要素を処理する際に、その要素が何番目にあるのか(インデックス番号)も同時に取得したい場合があります。例えば、「1番目の商品:りんご」のようにリスト表示したい場合などです。

eachメソッドでは、with_indexメソッドを組み合わせることで、要素と一緒にインデックス番号も取得できます。

fruits = ["りんご", "バナナ", "オレンジ"]
fruits.each.with_index(1) do |fruit, i|
puts "#{i}番目の商品は#{fruit}です"
end

このプログラムを実行すると、以下のように表示されます。

1番目の商品はりんごです
2番目の商品はバナナです
3番目の商品はオレンジです

with_indexメソッドを使うことで、2つのブロック変数を受け取ることができます。1つ目の変数(fruit)には配列の要素が、2つ目の変数(i)にはインデックス番号が代入されます。

with_index(1)のように引数を指定すると、インデックス番号が1から始まります。引数を省略すると、通常のプログラミングと同じく0から始まります。

fruits = ["りんご", "バナナ", "オレンジ"]
fruits.each.with_index do |fruit, i|
puts "#{i}番目の商品は#{fruit}です"
end

このプログラムを実行すると、以下のように表示されます。

0番目の商品はりんごです
1番目の商品はバナナです
2番目の商品はオレンジです

プログラムの要件に応じて、適切な開始番号を選ぶとよいでしょう。人間向けの表示なら1から始める方が自然ですが、他のプログラムで使うデータなら0から始める方が一般的です。

実用的な例: 配列の加工

eachメソッドは配列の加工にも便利です。例えば、すべての商品に消費税を加えた価格を計算する例を見てみましょう。

prices = [100, 200, 300]
tax_rate = 0.1 # 消費税率10%
tax_included_prices = []
prices.each do |price|
tax_included_price = price * (1 + tax_rate)
tax_included_prices.push(tax_included_price)
end
puts "税抜価格: #{prices.join(', ')}円"
puts "税込価格: #{tax_included_prices.join(', ')}円"

このプログラムを実行すると、以下のように表示されます。

税抜価格: 100, 200, 300円
税込価格: 110.0, 220.0, 330.0円

この例では、元の配列pricesの各要素に対して消費税を加えた価格を計算し、新しい配列tax_included_pricesに追加しています。最後にjoinメソッドを使って配列の要素をカンマ区切りの文字列に変換して表示しています。

このように、eachメソッドを使うと、配列の要素を加工して新しい配列を作ることも簡単にできます。

eachメソッドと他の制御構造の組み合わせ

eachメソッドは、他の制御構造(条件分岐など)と組み合わせることもできます。例えば、偶数の要素だけを処理したい場合は以下のように書けます。

numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
if number.even? # 偶数かどうかを判定
puts "#{number}は偶数です"
end
end

このプログラムを実行すると、以下のように表示されます。

2は偶数です
4は偶数です

このように、ブロック内で条件分岐を使うことで、特定の条件を満たす要素だけを処理することもできます。配列の要素を柔軟に処理したい場合に便利です。

まとめ

本章では、Rubyの配列処理で最も基本的かつ重要なeachメソッドについて学びました。以下の内容を理解できたことと思います。

  • eachメソッドを使うと、配列の要素を順番に処理できる
  • ブロックとブロック変数を使って、各要素に対する処理を記述する
  • ブロックはdo...endまたは{...}で囲んで書くことができる
  • with_indexメソッドを使うと、インデックス番号も同時に取得できる
  • ブロック内では通常のRubyコードと同様に、変数の使用や計算、条件分岐なども行える

eachメソッドは、Rubyプログラミングでは非常によく使われるメソッドです。配列の要素を一つずつ処理するという基本的な操作を簡潔に書けるため、ぜひ使いこなせるようになりましょう。

実際のプログラミングでは、eachメソッドを使って、データの集計、フィルタリング、変換など、様々な処理を行うことになります。本章で学んだ基本をもとに、さらに応用的な使い方も挑戦してみてください。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
case文で複数の条件分岐を簡潔に書こう