システム開発において、条件に一致している間または指定した回数処理を繰り返すという実装は頻繁に行われます。
本記事では、Rubyで繰り返し処理を実施する際に利用する「for」文について、サンプルコードを掲載しながらご紹介していきます。
for文の基本的な使い方
for文は繰り返しを行うための処理構文で、範囲を指定した上で繰り返したい処理を定義します。
基本構文
for文の基本的な記述方法は下記の通りです。
for 変数 in オブジェクト do 繰り返し処理 end
サンプル
for文で指定するオブジェクトには「範囲オブジェクト」や「配列オブジェクト」「マップオブジェクト」が利用されます。
範囲オブジェクト
範囲オブジェクトは「最初の値..最後の値」の形式で記述します。
for range in 1..5 do p(range) end
実行結果
$ruby sample.rb 1 2 3 4 5
サンプルの場合、範囲オブジェクトとして指定した「1~5」の値が順番に変数「range」に格納され、繰り返し処理として指定したコンソール出力が順番に実行されます。
配列オブジェクト
配列オブジェクトを範囲として指定した場合のサンプルも確認してみましょう。
for range in [1, 2, 3, 4, 5] do p(range) end
もちろん一旦変数オブジェクトに格納してfor文に記述することも可能です。
arrayObj = [1, 2, 3, 4, 5] for range in arrayObj do p(range) end
実行結果
$ruby sample.rb 1 2 3 4 5
処理の詳細に関しては範囲オブジェクトの場合と同じです。
マップオブジェクト
マップオブジェクトを利用する場合、変数を2つ用意して「key」と「value」をそれぞれ格納します。
mapObject = {"犬" => "ぽち", "猫" => "たま", "鳥" => "ぴよ"} for var1, var2 in mapObject p "var1の値は" + var1 + "、var2の値は" + var2 end
実行結果
$ ruby sample.rb "var1の値は犬、var2の値はぽち" "var1の値は猫、var2の値はたま" "var1の値は鳥、var2の値はぴよ"
「var1」にはマップオブジェクトのkeyとなる値が格納されており、「var2」にはvalueとなる値が格納されます。
for文を使ったパターン別サンプルコード
for文を使った処理では、繰り返し処理の途中で条件を設定し、「中断」「スキップ」「再実行」といった任意の処理を実行させることも可能です。
サンプルコードで各処理内容を確認していきましょう。
breakで処理を終了
「break」を記述した場合、繰り返し処理の途中だとしても中断させることが可能です。
例えば下記のサンプルでは値が「3」の場合に、繰り返し処理を終了するように記述しています。
for range in 1..5 do if range == 3 break end p(range) end
実行結果
$ruby sample.rb 1 2
サンプルの場合、コンソール出力を実施する前に値が「3」かどうかを確認し、「3」の場合には繰り返し処理を抜けるように記述しています。
ちなみにbreakではプログラム自体を終了させるわけではありませんので、下記のような2重ループの処理では内側のループのみを中断し外側のループの続きから再実行されます。
for num1 in 1..5 do p num1 for num2 in 6..10 do p num2 break end end
実行結果
$ ruby sample.rb 1 6 2 6 3 6 4 6 5 6
nextで処理をスキップ
上記「break」で利用したサンプルを「next」に修正するとどのような動きになるか確認してみましょう。
for range in 1..5 do if range == 3 next end p(range) end
実行結果
$ruby sample.rb 1 2 4 5
「next」を指定した場合、該当する条件の値のみ処理をスキップし、次の値から引き続き処理が続行されるためサンプルのような出力結果となります。
redoで再実行
同じくサンプルコードを「redo」に修正して実行してみましょう。
今回は少しサンプルコードに処理を追加します。
下記の記述で実行すると無限ループとなるため注意してください。
3の値で再実行が繰り返されるため処理を抜けることが出来ません。
for range in 1..5 do if range == 3 redo end p(range) end
例えば値が「3」の場合にrangeに「5」を代入してみましょう。
for range in 1..5 do if range == 3 range = 5 redo end p(range) end
実行結果
$ ruby sample.rb 1 2 5 4 5
redoの処理では、for文の評価を再度実行するのではなく、for文内に記述された処理内容のみが再度実行されます。
つまりredoの処理が完了した後、for文で行われる評価は代入した「5」の続きからではなく、元々の値である「3」の次の値「4」として処理が実行されるということです。
for文とその他繰り返し処理の違い
for文以外にもRubyで利用可能な繰り返し処理はいくつか存在します。
よく利用される処理をピックアップしてご紹介していきたいと思います。
while文
while文では指定した条件が「true」の間繰り返し処理が実施されます。
num = 1 while num <= 5 do p(num) num = num + 1 end
実行結果
$ ruby sample.rb 1 2 3 4 5
サンプルでは評価対象の変数「num」に初期値として1を代入し、「num」の値が5までの間処理を継続するよう記述しています。
each文
each文は主に配列の値を使って繰り返し処理を実施する際、利用されます。
arrayObj = ["犬", "猫", "猿", "鳥", "魚"] arrayObj.each do |obj| p(obj) end
実行結果
$ ruby sample.rb "犬" "猫" "猿" "鳥" "魚"
loop文
loop文では、上述した「brek」を利用して処理を強制的に終了させない限り、繰り返し処理が継続されます。
num = 1 loop { p(num) if(num == 5) break end num = num + 1 }
実行結果
$ ruby sample.rb 1 2 3 4 5
times文
times文では指定した回数だけ、繰り返し処理が実施されます。
5.times do |num| p num end
実行結果
$ ruby sample.rb 0 1 2 3 4
「指定回数.times」の形で繰り返し回数を指定することが可能です。
さいごに: Rubyのfor文はシステム開発の必須処理
本記事では、Rubyで繰り返し処理を記述する際に利用する「for」文の使い方についてサンプルコードを掲載しながらご紹介していきました。
for文を使用した繰り返し処理は、ほとんどのシステム開発で利用されています。
Rubyプログラマーとしての必須知識と言えますので、今回ご紹介した基本を押さえて応用的な処理も徐々に理解出来るよう学習していきましょう。
「do」は省略可能です。