1

如果在内部红宝石块中引发异常,我有兴趣打破外部和内部块。代码可能如下所示:

catch "ExitBlock" do
      foo.each_with_index do |el, idx|
        bar = ... // do more stuff, 
        bar.each_with_index do |el1, idx1|
          if some_bad_stuff
            throw "ExitBlock"
          end
        end
      end
    end

如果 some_bad_stuff 为真,它应该退出外部块和内部块,而不仅仅是内部块。上面的代码给了我一个 ArgumentError 但是:

ArgumentError: uncaught throw "ExitBlock"

我究竟做错了什么?

4

2 回答 2

2

它适用于符号:

catch :exit_block do
  foo.each_with_index do |el, idx|
    bar = ... // do more stuff, 
    bar.each_with_index do |el1, idx1|
      if some_bad_stuff
        throw :exit_block
      end
    end
  end
end

但是文档说“[argument] 可以是任意对象,而不仅仅是 Symbol”

我不知道是怎么回事。

于 2012-08-21T03:43:09.563 回答
0

跳出循环而不是将异常引入混合中会更干净:

foo.each_with_index do |el, idx|
    bar = ... // do more stuff, 
    break_outer = false
    bar.each_with_index do |el1, idx1|
        if some_bad_stuff
            break_outer = true
            break
        end
    end
    if break_outer
        break
    end
end
于 2012-08-21T03:40:38.547 回答