【Ruby入門】redo の使い方(繰り返し処理をスキップする)

redo を使うと、繰り返し処理の現在のループをもう一度やり直すことができます。

以下から Rubyでの「redo」の使い方を解説していきます。

 

redo の基本

「redo」を使うと、ブロック内のその後の処理を行わずに、今の処理のもう一度やり直すことができます。

繰り返し処理の中で

redo

と記述するだけで使えます。

redo と組み合わせて使える繰り返しの構文例

 

redo を使ったプログラム例

実際にプログラムを書いて動作を確認してみましょう。

 

繰り返し処理の現在のループをもう一度やり直す

以下は「actions」の変数に入っている配列の要素を順番に表示し、"retry" が出たら今の処理を3回までやり直す例。

プログラム
count = 0
actions = ["processing", "processing", "retry", "processing"]

actions.each do |action|
  p action
  
  if action == "retry" && count < 3
    count += 1
    redo
  end
end
実行結果
"processing"
"processing"
"retry"
"retry"
"retry"
"retry"
"processing"
メモ

配列の使い方について詳しくはこちら

メモ

i += 1 は、「i」の変数に入っている数値に 1 を足す書き方です。

i = i + 1 と書くこともできます。

each で配列の要素をひとつずつ取り出し、action == "retry" の条件に一致したら redo が実行され、もう一度、現在の要素での処理が開始されます。

redo で処理をやり直した場合は、count += 1 でやり直した回数をカウントしていきます。条件に count < 3 を入れてありますが、もしリトライ回数が3回を超えた場合は、リトライを中止して次の処理へ進みます。

そのため実行結果では最初に表示した "retry" と、3回やり直して表示した "retry" で、合計4回 "retry" が表示されていることが確認できます。

 

多重の繰り返し処理で redo を使う

以下は2重の繰り返し処理の中で、redo を使う例。

プログラム
3.times do
  p "外側のループ処理中"

  3.times do
    p "内側のループ処理中"
    sleep 1
    redo
  end
end
実行結果
"外側のループ処理中"
"内側のループ処理中"
"内側のループ処理中"
"内側のループ処理中"
 :
 :
メモ

times を使うと、指定した回数だけ 繰り返し処理を行うことができます。詳しくはこちら

メモ

sleep 1 は、1秒間 処理を停止するコードです。

2重のループの中で redo を使うと、内側のブロックの処理がやり直しされます。外側のブロックの処理がやり直しされることはありません。そのため、p "内側のループ処理中" というコードが繰り返し実行されますが、p "外側のループ処理中" のコードは実行されません。

今回のプログラム内では 処理を止める記述はないため、永遠にプログラムが実行されます。このようにプログラムを途中で止める制御をしておかないと無限にプログラムが動き続けてしまうため、注意が必要です。

プログラムを終了させるためは、キーボードの Ctrl + C を入力します。

 

まとめ

以上、Rubyでの「redo」の使い方でした!

 

ここまでの内容をまとめておきます。

  • 「redo」を使うと、ブロック内のその後の処理を行わずに、今の処理を もう一度やり直すことができる。
  • redo と組み合わせて使える繰り返しの構文には、each, while, until, for, times, upto, downto, loop がある。
  • 多重の繰り返し処理のブロック内で redo を使った場合は、そのブロックの処理のみがリトライされる。