大域脱出とは
ネスト分のbreakを書く必要がないように catch throw という大域脱出するため仕組みが準備されている。
繰り返しの処理を途中で終了する場合、 break を使うことがある。
しかし繰り返しの処理がネストしているかつ、一度に処理を終了させたい場合がある。
繰り返しの処理のネストが深い場合、そのネスト分のbreakが必要である。
複数のbreakを使った場合
複数のbreak文を使って、二つのloopを脱出できる。
これでも可能ですがわかりにくい。
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を確認すれば、
深く理解ができると思われる。
以上。
余談
なんでこう文章が硬いですかねぇ~~ こう、もっとね、 やわらかい文章が書きたい!!
間違えてる場所があったらマサカリください!! 待ってます!!