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がtrueの場合、内部ブロックだけでなく、外部ブロックと内部ブロックの両方を終了する必要があります。上記のコードは私に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

しかし、ドキュメントには、「[引数]はシンボルだけでなく、任意のオブジェクトになる可能性がある」と記載されています。

何が起こっているのかわかりません。

于 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 に答える