今回は Ruby の each メソッドの基本的な使い方について説明します。 each メソッドは配列、ハッシュ、範囲オブジェクトなど要素の数だけ処理を繰り返し実行します。
each メソッド
each メソッドの基本的な記述方法は以下の通りです。
1 2 3 |
オブジェクト.each do |変数| 実行する処理 end |
また、以下のようにも記述することができます。
1 2 3 |
オブジェクト.each { |変数| 実行する処理 } |
オブジェクトには配列やハッシュ、範囲オブジェクトなどを指定することができます。変数にはブロック内の処理で扱う名前を指定します。
配列オブジェクトの繰り返し
以下のプログラムは配列の要素を順番に出力する例です。
1 2 3 4 |
a = ["Tokyo", "Nagoya", "Osaka"] a.each do |x| puts x end |
実行結果
1 2 3 |
Tokyo Nagoya Osaka |
each は配列 a から1つずつ順番に要素を取り出し変数 x に代入していきます。上の例では、1回目の繰り返しに "Tokyo" という文字列が x に代入され puts x が実行されます。2回目に "Nagoya" という文字列が、3回目に "Osaka" という文字列が x に代入され puts x が実行されます。
そして、配列の要素の数だけ処理が実行されたので、ブロックから抜け出しプログラムが終了します。
範囲オブジェクトの繰り返し
each メソッドは範囲オブジェクトにも適用することができます。
1 2 3 4 |
a = 1..3 a.each do |x| puts x end |
実行結果
1 2 3 |
1 2 3 |
上の例では 1, 2, 3 の数値が順番に x に代入され処理が繰り返されていきます。範囲オブジェクトと each メソッドを使うことで指定回数分だけ処理を行うときに非常に便利です。
ハッシュオブジェクトの繰り返し
ハッシュに each メソッドを適用するときは以下のように記述します。
1 2 3 |
オブジェクト.each do |キー, 値| 実行する処理 end |
ハッシュに each メソッドを使うときは変数に「キー」と「値」を指定します。do 〜 end の代わりに { 〜 } でも記述することができます。以下はハッシュに each メソッドを適用した例です。
1 2 3 4 |
h = { "Jhon" => 25, "Mike" => 31, "Anna" => 18 } h.each do |name, age| puts "#{name}: #{age}" end |
実行結果
1 2 3 |
Jhon: 25 Mike: 31 Anna: 18 |
上の例ではハッシュの「キー」が変数 name に、「値」が変数 age に順番に代入されていきます。そして、ハッシュの要素の数だけブロック内で記述された処理が繰り返し実行された後、ブロックから抜け出し処理が終了します。
繰り返し処理に each を使用するメリット
繰り返し処理といえば for 文や while 文でも同様の処理を行うことができます。以下のコードでも上述の each メソッドを使用したときの例と同じ結果が得られます。
1 2 3 4 5 6 7 |
a = ["Tokyo", "Nagoya", "Osaka"] x = 0 while x < a.length do puts a[x] x += 1 end |
コードから見てわかるように、変数の初期化や終了判定の処理がない分 each メソッドを使用した方がより簡潔に記述できます。
また、each メソッドを使用する最大のメリットは、オブジェクトの範囲以上に処理が実行されないことが保証されていることです。上の例のように初期値や終了判定の指定した場合、これらの処理内容を間違えてしまうとプログラムがエラーになってしまいます。each メソッドを使用すればそのようなエラーの心配はなくなり、より堅牢なプログラムを記述することができます。