-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

返される値は最初に生成される必要があり、遅延評価はありません。したがって、再びfooが呼び出され、停止点なしで無限再帰が発生します。nilが必要な場合は、

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