catch/throwについて、あまり触れることがないので簡単な使い方をまとめておきます。
catch/throwとは
ループ処理の時に深くネスとした場合の大脱出の手段。
throwにシンボルまたは文字列のオブジェクトを指定します。
指定したオブジェクトをcatchで指定するのが基本の形になります。
catch :sample_loop do
throw :sample_loop
end
throwを指定すると、ブロックが中断します。
ループ処理が繰り返さずに結果が出力されてるのがわかります。
catch :sample_loop do
loop do
p "a"
loop do
p "b"
loop do
p "c"
throw :sample_loop
end
end
end
end
# => "a" "b" "c"が表示される
途中でthrow
を定義するとブロックが中断します。
catch :sample_loop do
loop do
p "a"
loop do
p "b"
throw :sample_loop
loop do
p "c"
end
end
end
end
# => "a" "b"が表示される
thorwの第二引数
throwの第二引数の戻り値を指定することができます。
def sample_method
throw :sample_loop, "finish!"
end
msg = catch :sample_loop do
sample_method
puts "hello" # => ブロックが中断され、出力されない
end
puts msg
# => finish! が出力される
throw
の第二引数に"finish!"
を渡し、ローカル変数msg
に値を格納して出力しています。
まとめ
深くネストしいる場合などで使う場合があるようですが、実際はあまり使われていないようです。
メモ程度に覚えておきます!