2013-02-09 77 views
-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,但實際上得到了貝洛w:

SystemStackError: stack level too deep 
    from /usr/lib/ruby/1.9.1/irb/workspace.rb:80 
Maybe IRB bug! 

我無法解釋爲什麼這個。任何人都可以幫我一樣嗎?

+0

你爲什麼期望得到'nil'? – 2013-02-09 19:41:06

+1

你爲什麼在你的投票中遞歸地調用foo? – Phrogz 2013-02-09 19:52:23

回答

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 
+0

我真的在黑暗中。爲什麼'puts(「bar - >」+ catch(:label){test.bar})'沒有拋出異常,而是產生錯誤? – DoLoveSky 2013-02-09 20:23:49

+0

咦?再來? – Reactormonk 2013-02-09 21:43:14

+0

我沒有得到你 - 什麼'再來'? – DoLoveSky 2013-02-10 05:03:04