-1
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!

我无法解释自己为什么会这样。任何人都可以帮助我吗?

4

1 回答 1

1

无限循环发生在抛出/捕获之外。

def foo
  throw(:label, foo) # <-
  "should never get here"
end

必须首先生成返回的值,那里没有惰性 eval。所以它再次调用 foo ,并且您可以无限递归而没有任何停止点。如果你想要零,使用

def foo
  throw(:label, nil) # <-
  "should never get here"
end
于 2013-02-09T19:42:56.197 回答