6

catchRubyでは、深くネストされたコードから飛び出すことを目的としています。たとえばJavaではtry-catch、例外を処理するためのJavaで同じことを実現できますが、それは不十分なソリューションと見なされ、非常に非効率的です。Rubyには例外を処理begin-raise-rescueするためのものがあり、他のタスクに使用するのもコストがかかると思います。

Rubyのcatch-throw方が本当に効率的なソリューションですか、begin-raise-rescueそれとも、Rubyを使用してネストされたブロックを壊す代わりに他の理由がありbegin-raise-rescueますか?

4

2 に答える 2

8

制御構造から抜け出すための「正しい」方法であることに加えて、catch-throw大幅に高速です(私のテストでは10倍高速です)。私のコードと結果については、この要点を確認してください。

于 2012-11-21T00:16:40.630 に答える
8

ジョシュの答えは正しいです。catch-throwおよびについてさらに情報を追加したいと思いraise-rescueます。

catch-throwフロー制御raise-rescueに使用されますが、例外/エラー処理に使用されます。違いは次のとおりです。(フロー制御)backtraceには必要ありません。私を信じてください。Joshの要点で実行が10回より遅くcatch-throwなる主な理由は、オブジェクトの作成に時間がかかることです。raise-rescuecatch-throwraise-rescuebacktrace

バックトレースを使用しない場合は、次raiseの構文を使用します。

raise <type>, <message>, <backtrace>

私の要点をチェックしてください。raise without backtraceよりもはるかに高速ですraise with backtrace

2016年4月の更新:

私は私の要点を更新しました:

  • 「ブレーク」テストを修正
  • 新しいルビーバージョン2.1.8、2.2.4、2.3.0のベンチマークテスト結果を追加しました
于 2013-06-26T05:53:35.713 に答える