まつもと ゆきひろです.
In message "[ruby-list:408] Re: reexecute from rescue [ Re: about exception ]"
on 96/08/13, Yukihiro Matsumoto <matz / caelum.co.jp> writes:
||クロージャをどっかに代入しておいて, 戻りたくなったらそれを実行するとい
||うのは無理でしたよね??
|
|それは無理ですけど,
|# closure は call/cc ではないので.
|closureを引数などで渡しておいて例外が起きたら評価するという
|のは出来ると思います.
具体的なコードで書くと以下の通りです.
def each(lambda)
begin
...
yield ..
rescue
lambda.call
retry
end
end
each(proc{...}) {
...
}
|イテレータブロックはその場で評価されるものは普通のループと変
|わりません.trapのようにclosureとして保存されてあとで評価さ
|れるものは break(脱出),next(やり直し)だけしかつかえません.
|今ソースを見たらreturn, retryも通しているようですが,これは
|バグです.
さらによくソースを見ると break を通していませんでした.これ
もバグです.今までの説明と動作が食い違っていましたね.ごめん
なさい.
まつもと ゆきひろ /:|)