【Ruby】eachメソッドの使い方の基礎から応用まで現役エンジニアが解説します

最終更新日:

この記事では、

  • Rubyのeachメソッドの基本的な使い方を学びたい。
  • eachメソッドを使った配列やハッシュの操作方法を知りたい。
  • eachメソッド以外のRubyの繰り返し処理メソッドについて学びたい。
  • eachメソッドの実際の活用例を具体的に知りたい。
  • eachメソッドの応用方法やバリエーションを知りたい。

という悩みを抱えている向けに、

  • Rubyのeachメソッドの基礎的な利用方法
  • eachメソッドを配列、範囲、ハッシュで活用する
  • 各種eachメソッドの応用的な使い方

について解説していきたいと思います。

Rubyのeachメソッドを使ってコレクションを操作する方法

Rubyにおいて、コレクション(配列やハッシュなど)を操作する際にはeachメソッドが非常に便利です。このメソッドを用いることで、コレクションに含まれる各要素に対して同じ操作を繰り返し適用することができます。

Rubyでeachメソッドを理解しよう

eachメソッドとループ処理の基本

Rubyで配列やハッシュに対して繰り返し処理を行う最も一般的な方法がeachメソッドです。使い方は非常にシンプルで、次のように書きます。

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

 

このコードは、配列内の各要素を出力します。実行結果は以下の通りです。

1

2

3

 

配列の各要素がnumber変数に代入され、doからendまでのブロック内の処理が繰り返されます。

eachメソッドの多様な活用法

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

{ apple: 'リンゴ', orange: 'オレンジ', melon: 'メロン' }.each do |key, value|
   puts "#{key}は日本語で#{value}です。"
end

このコードは各キーバリューペアを出力します。実行結果は以下の通りです。

appleは日本語でリンゴです。

orangeは日本語でオレンジです。

melonは日本語でメロンです。

 

このようにして、eachメソッドを用いることで、Rubyにおける様々なコレクションの操作が可能になります。

eachメソッドを配列、範囲、ハッシュで活用する

配列を操作するeachメソッドの例

Rubyにおける配列は、複数の要素を順序付けて格納することができるコレクションです。配列を扱う際に、eachメソッドを使用して、配列内の各要素に対して繰り返し処理を適用することが一般的です。次の例では、eachメソッドを使用して配列の各要素を一つずつ出力します。

fruits = ["リンゴ", "オレンジ", "メロン"]

fruits.each do |fruit|
   puts fruit
end

このコードを実行すると、以下のように配列内の各要素が出力されます。

リンゴ

オレンジ

メロン
Rubyの配列操作完全マニュアル | 追加 / 更新 / 削除 / 繰り返しの方法について現役エンジニアが解説

範囲オブジェクトでeachメソッドを使う具体例

Rubyでは、.....を使用して範囲オブジェクトを生成することができます。これらの範囲オブジェクトにもeachメソッドを適用することができます。次の例では、1から5までの範囲オブジェクトを生成し、その範囲内の各数字を出力します。

(1..5).each do |num|
   puts num
end

このコードを実行すると、1から5までの数字が順番に出力されます。

1

2

3

4

5

ハッシュを扱うeachメソッドの応用

ハッシュはキーと値のペアで構成されるコレクションです。eachメソッドはハッシュに対しても使用でき、キーと値のペアそれぞれに対して繰り返し処理を行うことができます。以下の例では、eachメソッドを使用して、ハッシュの各要素のキーと値を出力します。

fruits_price = { apple: 100, orange: 200, melon: 300 }
fruits_price.each do |key, value|
    puts "#{key}の価格は#{value}円です。"
end

 

このコードの実行結果は以下の通りです。

appleの価格は100円です。

orangeの価格は200円です。

melonの価格は300円です。

これらの例からもわかるように、Rubyのeachメソッドは配列、範囲、ハッシュなど様々なコレクションに対して柔軟に活用することができ、Rubyプログラミングの基礎的な部分をなす重要なメソッドです。

【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します

eachのバリエーションと応用

each_sliceやeach_with_objectなどの応用例

Rubyにはeachメソッドのバリエーションとしてeach_sliceeach_with_objectなど、より高度な繰り返し処理を行うためのメソッドがあります。これらのメソッドを活用することで、コードをより効率良く記述することができます。

例えば、each_sliceメソッドは集合を指定したサイズの「スライス」(部分配列)に分割し、それぞれのスライスに対してブロックを実行します。次の例では、1から10までの数値を含む配列を3つずつのスライスに分割し、各スライスを出力しています。

(1..10).each_slice(3) do |slice|
   p slice
end

 

このコードを実行すると、以下のように配列が3つずつのグループに分割されて出力されます。

[1, 2, 3]

[4, 5, 6]

[7, 8, 9]

[10]

 

一方、each_with_objectメソッドは各要素に対する処理と共に、あるオブジェクト(例えば、空のハッシュや配列)を引き渡し、そのオブジェクトをブロック内で更新できます。結果として、更新されたオブジェクトが返されます。次の例では、配列の各要素をキーとし、その要素の長さを値とするハッシュを作成しています。

words = ["apple", "orange", "melon"]
lengths = words.each_with_object({}) do |word, hash|
   hash[word] = word.length
end
p lengths

このコードを実行すると、以下のハッシュが出力されます。

{"apple"=>5, "orange"=>6, "melon"=>5}

 

これらのメソッドを使いこなすことで、Rubyでの繰り返し処理の幅が大きく広がります。

eachに関連するメソッド

reverse_eachについて

reverse_eachメソッドは、eachメソッドと同様に繰り返し処理を行いますが、コレクションの要素を逆順に処理します。これにより、特に配列や範囲オブジェクトでの処理順序を逆転させる際に便利です。

[1, 2, 3].reverse_each do |number|
   puts number
end

このコードは、配列内の要素を逆順に出力します。実行結果は以下のようになります。

3

2

1

each_with_indexの役割と使い方

each_with_indexメソッドは、eachメソッドと同じように繰り返し処理を行いますが、追加で各要素のインデックスもブロックに渡します。これにより、要素だけでなく、その要素の位置も知ることができます。

["リンゴ", "オレンジ", "メロン"].each_with_index do |fruit, index|
   puts "#{index}: #{fruit}"
end

このコードは、配列の各要素とそのインデックスを出力します。実行結果は以下の通りです。

0: リンゴ

1: オレンジ

2: メロン

 

このように、eachメソッドのバリエーションを理解し活用することで、Rubyプログラミングの柔軟性と表現力を高めることができるでしょう。

一緒に理解しておきたい繰り返し処理のメソッド

Rubyのプログラミングでは、eachメソッドだけでなく、他にも多くの繰り返し処理を行うメソッドが用意されています。これらのメソッドを適切に使い分けることで、より効率的なコードを書くことができます。

select, filter

select(またはfilter)メソッドは、ブロックの条件に一致する要素だけを取り出して新しい配列を返します。これにより、特定の条件でフィルタリングした結果を得ることができます。

numbers = [1, 2, 3, 4, 5]
even_numbers = numbers.select { |number| number.even? }
p even_numbers

このコードは、偶数のみをフィルタリングして出力します。実行結果は以下の通りです。

 [2, 4]

【Ruby】 selectメソッド完全マニュアル | 基礎から応用・filterとの違いについても解説

 

reject, reject!

逆に、rejectメソッドは、ブロックの条件に一致する要素を除外した配列を返します。reject!メソッドはrejectと同様の動作をしますが、元の配列自体を変更する点が異なります。

numbers = [1, 2, 3, 4, 5]
numbers.reject! { |number| number.even? }
p numbers

このコードは、偶数を除外した配列を出力します。実行結果は以下の通りです。

[1, 3, 5]
【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説

sort

sortメソッドは、配列の要素をソートして新しい配列を返します。ブロックを与えることで、カスタムのソート条件を定義することもできます。

words = ["melon", "apple", "orange"]
sorted_words = words.sort
p sorted_words

このコードは、アルファベット順にソートされた配列を出力します。実行結果は以下の通りです。

["apple", "melon", "orange"]
Rubyのsortメソッドの使い方 | sort_byとの違いも解説

map

mapメソッド(別名: collect)は、配列の各要素に対してブロックを実行し、その結果を新しい配列として返します。これにより、配列の各要素を変換した結果を得ることができます。

numbers = [1, 2, 3]
squared_numbers = numbers.map { |number| number ** 2 }
p squared_numbers

このコードは、各要素を2乗した結果を出力します。実行結果は以下の通りです。

[1, 4, 9]

これらのメソッドを習得することで、eachメソッドだけでなく、より幅広くRubyの繰り返し処理を扱うことができるようになります。

Enumerable#map

【Ruby】mapメソッドの使い方は?eachとの違いや発展的な使い方について現役エンジニアが解説