LoginSignup
0
0

More than 1 year has passed since last update.

【Ruby】catch/throwについて

Posted at

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に値を格納して出力しています。

まとめ

深くネストしいる場合などで使う場合があるようですが、実際はあまり使われていないようです。
メモ程度に覚えておきます!

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0