From: Yukihiro Matsumoto Date: 2005-03-07T14:52:04+09:00 Subject: [ruby-dev:25822] Re: break & retry in block まつもと ゆきひろです In message "Re: [ruby-dev:25808] break & retry in block" on Fri, 4 Mar 2005 12:34:04 +0900, Shin-ichiro HARA writes: |proc{} 中の break と retry の動作なんですが、ver 1.8.2 で | | #(1) | def foo; yield; end | p foo(&proc{ break(0); 1 }) #=> LocalJumpError | | #(2) | def bar(x); yield(x); end | i = 0; p bar(i+=1, &proc{|x| retry if x<2; x }) #=> 2 | |となっていますが、(2)がokなら(1)もokでいいんじゃないで |しょうか? 「(2)がokなら(1)もok」という論理はよくわかりませんが、(1)が エラーになるのはバグでしたので、修正します。 |それから、 | | #(3) | p proc{ break(0); 1 }.call #=> 0 | | #(4) | i = 0; p proc{ retry if (i+=1)<2; i }.call #=> LocalJumpError | |(4)がエラーなら(3)もエラーじゃないかな。ここは break(0) ではな |く next(0) を使うべきだといういうことでいいんじゃないかと思う |のだけど、どうでしょう。 こちらも「(4)がエラーなら(3)もエラーじゃないか」という理屈が 分かりません。(4)はretryで再実行するべきメソッド(proc)がcall を介してブロックが評価された時点ではすでに終了しているからエ ラーになっているわけです。(3)にはそのような理由はありません からエラーになりません。1.9では(3)がエラーになっていますが、 これはバグだと思います。 まつもと ゆきひろ /:|}