[転帖]ruby中的catch throw
948 ワード
[転帖]ruby中的catch throw
原文:
http://fujinbing.iteye.com/blog/1126246
ライセを使ってエラーを処理するためにレスキューを使って、深い入れ子構造から処理フローを飛び出すこともできます.catchとthrowも深い入れ子構造から処理フローを飛び出すことができます.
スイッチはコードブロックを定義し、このコードブロックに名前を表示します.Rubyがthrowに出会うと、スタックを呼び出して対応するcatchブロックを検索し、見つけたらRubyは対応するcatchでスタックを展開し、ブロックを停止する.
3
2
1
0
Reach here
上記の例では、まず「catch(:done)」というブロックを表示し、「throw:done」を実行すると、現在の「catch(:done)」に表示されているブロックを中止して、処理の流れを下に進める.
catch/throwでは、throwに出会うと、Rubyはスタックを呼び出してマッチしたcatchを検索し、見つけたらスタックが展開され、catchブロックの残りのコードは実行されない.
Rubyにはgoto文がありませんが、catch/throwまたは異常を使ってgotoの機能を実現できます.
原文:
http://fujinbing.iteye.com/blog/1126246
ライセを使ってエラーを処理するためにレスキューを使って、深い入れ子構造から処理フローを飛び出すこともできます.catchとthrowも深い入れ子構造から処理フローを飛び出すことができます.
スイッチはコードブロックを定義し、このコードブロックに名前を表示します.Rubyがthrowに出会うと、スタックを呼び出して対応するcatchブロックを検索し、見つけたらRubyは対応するcatchでスタックを展開し、ブロックを停止する.
def method1(n)
puts n
throw :done if n <= 0
method1(n-1)
end
catch(:done) {
method1(3)
puts "Can not reach here!"
}
puts "Reach here!"
実行結果:3
2
1
0
Reach here
上記の例では、まず「catch(:done)」というブロックを表示し、「throw:done」を実行すると、現在の「catch(:done)」に表示されているブロックを中止して、処理の流れを下に進める.
catch/throwでは、throwに出会うと、Rubyはスタックを呼び出してマッチしたcatchを検索し、見つけたらスタックが展開され、catchブロックの残りのコードは実行されない.
Rubyにはgoto文がありませんが、catch/throwまたは異常を使ってgotoの機能を実現できます.