ネストの深い(多重)ループを抜け出す - 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

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍