与Ruby“Catch / Throw”构造混淆

时间:2013-02-09 19:38:30

标签: ruby

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!

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

1 个答案:

答案 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