けいじゅ@SHLジャパンです. ナガーイメイルは後に回します. 今日中に返事ができればいいんだけど... あ と, pipeの件もあるし... In [ruby-list :00408 ] the message: "[ruby-list:408] Re: reexecute from rescue [ Re: about exception ] ", on Aug/13 01:21(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >それは無理ですけど, ># closure は call/cc ではないので. >closureを引数などで渡しておいて例外が起きたら評価するという >のは出来ると思います. ?? 良く分からん. と思ったら, 次のメイルに書いてありましたね. In [ruby-list :00409 ] the message: "[ruby-list:409] Re: reexecute from rescue [ Re: about exception ] ", on Aug/13 01:49(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >具体的なコードで書くと以下の通りです. > >def each(lambda) > begin > ... > yield .. > rescue > lambda.call > retry > end >end > >each(proc{...}) { > ... >} なるほど, 例外が起こった時の処理を イテレータブロック(?)として渡すわけ ですね. この方法なら対処できそうです. Smalltalk の coll remove: elm ifAbsent: [...] と同じ考えですね. ruby でも こういう感じのメソッドがあるかと思って調べ ましたがありませんでした. やはり, 例外があるからかな? >|あと, 質問ですが, 例外からぬける方法は以下のもの以外に何かあるのでしょ >|うか? >| >|* break/ブロック最後: そのbegin...end からぬける >|* retry: begin ... end の begin から >| >|# return はやはりできなかった... > >はい? 例外から抜けるというのはrescue節から抜けるという意味で >すか? それとも trap などのイテレータブロックから抜けるという >意味ですか? rescue節でした. >rescue節は特別な制御スコープを導入しませんから,beginから再 >実行するretryを除いてはbeginの外側となにも変わりません. >returnも使えます. そうすると, break で rescue 節を抜ける(begin..endを終る)ことはできない のですね? # return が使えなかったのは, mainモジュールだったからでした... >イテレータブロックはその場で評価されるものは普通のループと変 >わりません.trapのようにclosureとして保存されてあとで評価さ >れるものは break(脱出),next(やり直し)だけしかつかえません. >今ソースを見たらreturn, retryも通しているようですが,これは >バグです. ふむふむ... In [ruby-list :00409 ] the message: "[ruby-list:409] Re: reexecute from rescue [ Re: about exception ] ", on Aug/13 01:49(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >さらによくソースを見ると break を通していませんでした.これ >もバグです.今までの説明と動作が食い違っていましたね.ごめん >なさい. trap(closureも含めて)中で, breakは意味が分かりましたが, nextはどういう 動作を行なうのでしょうか? __ ..........................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----