ネストの深い(多重)ループを抜け出す - Rubyのthrow/catch


Rubyの標準メソッドにthrow/catchはネストの深いループ(多重ループ)を一発で抜けだしたい場合などに使えそうですので、紹介します。


😀 throw/catchの説明

次のサンプルソースを使って、throw/catchを説明します。

def ween
puts 'ween'
throw :symbol
end
catch(:symbol) do
ween
puts 'hoge'
end
Ruby throw.rb
> ween # hoge => 出力されず

つまり「throw/catch」は「raise/rescue」とほぼ同じ動きをします。

# 両者の違い
* throw/catch => symbol
* raise/rescue => Error(例外)

🐞 throw/catchを使ったネストの深いループからの脱出

throw/catchはsymbolのため、通常のネストの深いループから抜け出したい場合などにも使えます。

catch(:break_loop) do
3.times do |i|
3.times do |j|
puts "i, j = #{i}, #{j}"
throw :break_loop if i == 2 and j == 1
end
end
end
puts "loop out"
Ruby throw2.rb
>i, j = 0, 0
>i, j = 0, 1
>i, j = 0, 2
>i, j = 1, 0
>i, j = 1, 1
>i, j = 1, 2
>i, j = 2, 0
>i, j = 2, 1
>loop out

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)