module function Kernel.#catch

catch {|tag| .... } -> object[permalink][rdoc]
catch(tag) {|tag| .... } -> object

Kernel.#throwとの組み合わせで大域脱出を行います。 catch はブロックを実行します。

ブロックの実行中に tag と同一のオブジェクトを引数とする Kernel.#throw が行われた場合は、その throw の第二引数を戻り値として、ブロックの実行を終了します。

主にネストしたループから一気に脱出するのに使用します。

引数を省略した場合、タグとなるオブジェクトが内部で生成され、ブロックパラメータ tag に渡されます。

[PARAM] tag:
タグとなる任意のオブジェクトです。
[RETURN]
ブロックの返り値か、対応するthrowの第二引数を返り値として返します。
result = catch do |tag|
  for i in 1..2
    for j in 1..2
      for k in 1..2
        throw tag, k
      end
    end
  end
end

p result #=> 1

[SEE_ALSO] Kernel.#throw