class Test
def foo
throw(:label, foo)
"should never get here"
end
def bar
"bar"
end
end
test = Test.new
现在我尝试了以下内容:
puts("bar -> " + catch(:label) {test.bar})
得到了:
bar -> bar
=> nil
现在我尝试了:
puts("foo -> " + catch(:label) {test.foo})
我预计我会得到nil
,但实际上得到了以下内容:
SystemStackError: stack level too deep
from /usr/lib/ruby/1.9.1/irb/workspace.rb:80
Maybe IRB bug!
我无法解释自己为什么会这样。任何人都可以帮助我吗?
答案 0 :(得分:1)
无限循环发生在throw / catch之外。
def foo
throw(:label, foo) # <-
"should never get here"
end
必须首先生成返回的值,不存在惰性eval。所以 它再次调用foo,你有无限的递归 停止点。如果你想要零,请使用
def foo
throw(:label, nil) # <-
"should never get here"
end