Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Kernel | throw

概要

Kernel#throw(tag, value = nil) -> ()

詳細

Kernel.#catchとの組み合わせで大域脱出を行います。
throw は同じ tag を指定した catch のブロックの終わりまでジャンプします。
tag はメソッド内とは限らない。

サンプルコード
def pattern1
  cnt = 0
  catch(:pattern1) do
    loop do
      cnt += 1
      puts cnt
      throw :pattern1, "pattern1" if cnt == 5
    end
  end
end

print pattern1

def pattern2_1
  cnt = 0
  loop do
    cnt += 1
    puts cnt
    throw :pattern2, "pattern2" if cnt == 5
  end
end

def pattern2_2
  cnt = 0
  catch(:pattern2) do
    begin
      pattern2_1
    ensure
      puts "ensure"
    end
  end
end

puts
print pattern2_2

出力

1
2
3
4
5
pattern1
1
2
3
4
5
ensure
pattern2