[#380] bug report#3 and request#5 — keiju@... (Keiju ISHITSUKA)
けいじゅ@SHLジャパンです.
1 message
1996/08/06
[ruby-list:409] Re: reexecute from rescue [ Re: about exception ]
From:
matz@... (Yukihiro Matsumoto)
Date:
1996-08-12 16:49:44 UTC
List:
ruby-list #409
まつもと ゆきひろです.
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 を通していませんでした.これ
もバグです.今までの説明と動作が食い違っていましたね.ごめん
なさい.
まつもと ゆきひろ /:|)