幸ログ

ナレッジを溜めていきます

Ruby Goldを目指して ~ 大域脱出 ~

大域脱出とは

ネスト分のbreakを書く必要がないように catch throw という大域脱出するため仕組みが準備されている。
繰り返しの処理を途中で終了する場合、 break を使うことがある。
しかし繰り返しの処理がネストしているかつ、一度に処理を終了させたい場合がある。
繰り返しの処理のネストが深い場合、そのネスト分のbreakが必要である。

複数のbreakを使った場合

複数のbreak文を用いた脱出

複数のbreak文を使って、二つのloopを脱出できる。
これでも可能ですがわかりにくい。

catch throwを使った場合

catch throwを使った時の大域脱出

catch throwを使って、二つのloopを脱出できる。
break文を使った時とcatch throwを使った場合のコードを比較すると、
catch throwのほうが読み易い。

catch throwの詳細

catch throwはkernelモジュールのメソッドである。
Kernel.#catch
Kernel.#throw

catchの構文

Kernel.#catch Kernel.#throwの構文

catchで定義するtagはSymbolが望ましい。
Symbolを使用した場合、同じObjectIDが設定されるためである。
catch throwのtagはObjectIDでの比較によって終了するようになっている。
==, ===, eql?の比較ではなく、equal?での比較であるため、Symbolを使うことが望ましい。
理解が十分ではない場合、String, Fixnum, Symbolのインスタンスが作られた際のオブジェクトIDを確認すれば、 深く理解ができると思われる。

以上。

余談

なんでこう文章が硬いですかねぇ~~ こう、もっとね、 やわらかい文章が書きたい!!

間違えてる場所があったらマサカリください!! 待ってます!!