catch

catch

ri

 ----------------------------------------------------------- Kernel#catch
      catch(symbol) {| | block }  > obj
 ------------------------------------------------------------------------
       catch  executes its block. If a  throw  is executed, Ruby searches
      up its stack for a  catch  block with a tag corresponding to the
       throw 's _symbol_. If found, that block is terminated, and  catch 
      returns the value given to  throw . If  throw  is not called, the
      block terminates normally, and the value of  catch  is the value of
      the last expression evaluated.  catch  expressions may be nested,
      and the  throw  call need not be in lexical scope.
 
         def routine(n)
           puts n
           throw :done if n <= 0
           routine(n-1)
         end
      
         catch(:done) { routine(3) }
 
      _produces:_
 
         3
         2
         1
         0
 

refe

 Kernel#catch
 --- catch(tag) {|tag| .... }
 
     ブロックを実行してその値を返します。ブロックの実行中に
     tag と同じ名前の throw が行われた
     場合は、その throw の第二引数戻り値とします。
 
     例えば以下のコードを実行すると some_process は
     呼び出されず、また catch戻り値は 10 ではなく 25 に
     なります。
 
       ret = catch(:exit) {
          throw :exit, 25
          some_process()
          10
       }
       p ret   #=> 25
 
     ネストしたループは break によって一気に抜
     けることはできません。
     このような場合、catch や 例外 [制御構造/begin] を使用します。
 
       catch(:loop1) {
         for i in 1..2
           for j in 1..2
             throw :loop1, j
           end
         end
       }
 

* はてなダイアリーキーワード:catch