eachメソッドを使ってオブジェクトに含まれている要素を順に取り出す

each メソッドは配列や範囲オブジェクトなどで用意されているメソッドであり、オブジェクトに含まれている要素を順に取り出すことができます。ここでは Ruby で each メソッドを使ってオブジェクトに含まれている要素を順に取り出す方法について解説します。

(Last modified: )

eachメソッドの使い方

each メソッドは次のように使用します。

オブジェクト.each{|変数|
  実行する処理1
  実行する処理2
}

または次のように記述することもできます。

オブジェクト.each do |変数|
  実行する処理1
  実行する処理2
end

オブジェクトに含まれる要素を succ メソッドで順に取得して変数に格納し、 { から } までの処理(又は do から end までの処理)を実行します。オブジェクトに含まれる要素が無くなるまで繰り返し行われます。

具体的には次のように使用します。

range = 5..8
range.each{|num|
  puts("num = " + num.to_s)
}

上記の場合では、範囲オブジェクトに対して each メソッドが実行されています。範囲オブジェクトから順に 5, 6, 7, 8 が取り出されて変数「num」に格納されたあと、 { から } までの処理が実行されます。(範囲オブジェクトからどのように要素が取得されるのかは「範囲オブジェクトを繰り返し処理の中で利用する」を参照して下さい)。

上記では範囲オブジェクトをいったん変数に格納していますが、次のように範囲オブジェクトに対して直接メソッドを記述することもできます。

(5..10).each{|num|
  print("num = ", num)
}

範囲オブジェクトを直接記述する場合は、範囲オブジェクトを () で囲って記述して下さい。

なお each メソッドは for 文を使って同じように記述することが可能です。

for num in 5..10 do
  print("num = ", num)
end

each メソッドも for 文もほぼ同じ動作をします。

イテレータ

ここで解説した each メソッドや別のページで解説する times メソッドなどのように繰り返しを行うブロック {} 付きのメソッドをイテレータと呼んでいます。(ただ繰り返し以外のメソッドでもブロック付きのものはイテレータと呼ぶ場合もあるようです)。

イテレータという言葉自体はそれほど気にする必要はありません。メソッドから呼び出される処理をまとめたブロックを合わせて指定しているだけです。イテレータのメソッドであれば、対象のオブジェクトから要素をひとつひとつ取り出し、その度にブロックに処理を移して実行してくれます。

ブロックは {} で囲うか doend で囲う方法があります。これらはほぼ同じですが、微妙に動作が違う場合もあるようです。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

(18..20).each{|num|
  puts("num = " + num.to_s)
}

puts()

["東京都","千葉県","埼玉県"].each do |str|
  puts("str = " + str)
end

下記のように実行して下さい。

eachメソッド

-- --

Ruby で each メソッドを使ってオブジェクトに含まれている要素を順に取り出す方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。