From: eklerni Date: 2007-07-27T05:53:54+09:00 Subject: [ruby-dev:31306] Re: retryの使い方 松尾といいます。 > Tanaka Akira さんは書きました: > 実際にはどのようなユーザー定義ループを作りたいんでしょう? > > 普通のイテレータではうまくいかないんでしょうか。 前回のはwhileを使わずにwhileを定義するにはretryが必要、という要旨の発言 ですが、 実際にretryがあったほうがうれしい場面を考えてみると、たとえば def foo while 条件 yield #ループ本体(Y) end #なんらかの処理(A) end みたいなメソッドを書いたときに、yieldとyieldの間と#なんらかの処理(A)の後で 共通の#後処理(B)をしたいとします。(Y)(B)..(Y)(B)(Y)(A)(B)みたいに。すると def foo while 条件 #後処理 if 二回目のループからtrueになるフラッグ yield end #なんらかの処理 #後処理 end みたいになって、#後処理のコードが分かれちゃうんですが、retryを使えば def foo yield retry if 条件 #なんらかの処理 ensure #後処理 end とロジックがすっきりする場面もあります。 > Yuguiといいます。 > > 知りませんでした。驚きです。 > しかし、このretryがあり得るならアナロジーでProc#retryが欲しくなりませ んか。 どこに戻るのかわからなくなりそうですね。でも 無名関数として振舞うことが期待されているlambdaには欲しいかな、と思います。 あとささださんへ。lambdaについてですが、 def foo &po lambda(&po).call  p :methodend end foo{return} #1.9#unexpected return (LocalJumpError) #1.8#=>:methodend foo(&proc{return}) #1.9#unexpected return (LocalJumpError) #1.8#=>:methodend 1.8だとどちらもnextのように働きますが、1.9だとunexpected return (LocalJumpError)になります。 lambdaの挙動としては1.8のようにブロックを抜けるほうを期待しちゃうんです が、どうでしょう?