Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのredo・retry・nextキーワード徹底解説!ループと例外処理の制御方法

例外発生後の再試行について解説した際に、retryキーワードについて触れました。今回はあまり知られていないその仲間であるredoを紹介します。redoも似たような動作をしますが、ブロック全体ではなくループのイテレーション(繰り返し)を再実行する点が異なります。

redoキーワードとは

前回のAcademy記事で学んだように、retryを使うとブロック内のコードを再試行できます。

begin
  puts "Iteration"
  raise
rescue
  retry
end

この例では、例外を発生させる前にコンソールに「Iteration」という文字列が出力されます。その後rescue節が実行され、retryが呼び出されてブロックの最初から再度実行されます。結果として、プログラムは無限に「Iteration」を出力し続けることになります。

redoキーワードを使うと、ループ使用時に同様の効果を実現できます。これは、たとえばイテレーション中に再試行が必要な状況で役立ちます。

10.times do |i|
  puts "Iteration #{i}"
  redo if i > 2
end

実行結果は以下のようになります。

$ ruby redo.rb
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 3
Iteration 3
...

注目すべきは、イテレーションのカウントが変わっていない点です。redoは実行位置をループの先頭に戻します。ちなみに、以下のようにretryを使ったコードでも、まったく同じ出力が得られます。

10.times do |i|
  begin
    puts "Iteration #{i}"
    raise if i > 2
  rescue
    retry
  end
end

redoを使えば、ループ内でのリトライ処理を簡単に実装できます。次の例ではジョブのキューがあり、各ジョブは:success:failureを返します。ジョブが成功するまで、同じイテレーションを繰り返し実行し続けます。

[job_1, job_2, job_3, job_4].each do |job|
  redo unless job.call == :success
end

Ruby 1.8との違い

Ruby 1.8と1.9の間で、retryredoの挙動が変更されました。以前はどちらもループのイテレーションを再開していましたが、それぞれ異なる方法で行われていました。1.9以降では、retrybegin/rescueブロック内でのみ動作し、redoはループ内でのみ動作するようになっています。

nextキーワードとは

現在のイテレーションの先頭に戻るのではなく、次のイテレーションへ進みたい場合は、nextを使用します。

10.times do |i|
  puts "Iteration #{i}"
  next if i > 2
  puts "Iteration done"
end

実行結果は以下のようになります。

$ ruby next.rb
Iteration 0
Iteration done
Iteration 1
Iteration done
Iteration 2
Iteration done
Iteration 3
Iteration 4
...

イテレーションのカウンターが増加し続けているのがわかるでしょうか。ほとんどの場合、nextを使うのが適切です。一方、ループが正確な回数だけ実行される必要がある場合や、配列をイテレートする際にエラー処理を行いたい場合には、redoを検討するとよいでしょう。

この記事を通じて、ループ内のイテレーションのやり直しについて新しい発見があったなら幸いです。本記事(またはAppSignal Academyシリーズの他の記事)へのご感想をお聞かせください。また、さらに詳しく学びたいRubyのテーマがあれば、お気軽にお知らせください。

  1. RuboCopで実現するRubyコードのリントと自動フォーマット徹底ガイド

    リンティング(Lint)とは、ソースコードに含まれるプログラム上の誤りやスタイル違反を自動的に検出する仕組みです。このチェックは「リンター」と呼ばれる静的コード解析ツールによって行われます。一方、コードフォーマッターは、あらかじめ設定されたルールセットにソースコードを厳密に準拠させることに特化したツールです。一般的にリンターは違反を報告するだけで、実際の修正はプログラマーの手に委ねられます。それに対してコードフォーマッターは、ルールを直接ソースコードに適用し、フォーマットのミスを自動的に修正してくれます。 プロジェクトで一貫性のあるコードスタイルを実現するには、通常リンティング用とフォーマッ

  2. Rubyでのログ出力をマスターする:LoggerとLogrageの使い方徹底解説

    Rubyでのログ出力入門:LoggerとLogrageの使い方 ロギングは、アプリケーション開発において最も重要なタスクの一つです。ログは以下のような場面で活用されます。 アプリ内部で何が起きているかを把握したいとき アプリケーションを監視したいとき 特定のデータに関するメトリクスを収集したいとき 新しいプログラミング言語を学ぶ際、最初に選ばれるのはその言語がネイティブに備えているロギング機構でしょう。標準機能は通常、扱いやすく、ドキュメントも充実しており、コミュニティでも広く使われています。 ただし、ログデータの内容や扱い方は、企業の方針、ビジネスの性質、アプリケーションの種類に