[ruby-list:243] TUTORIAL - ensure(unwind-protect)
From:
matz@... (Yukihiro Matsumoto)
Date:
1996-03-07 06:32:01 UTC
List:
ruby-list #243
まつもと ゆきひろ@トヨタケーラムです.
今回が一連の(難しいと評判の)チュートリアルの最終回です.
次回からは気持も新たに*新*チュートリアルをはじめます.
# でも,ちょっと間があきそう.
--
後始末を忘れずに(ensure)
後処理が必要な場合というのはあるものだ.例えば,オープンした
ファイルをクローズしたり,メモリの中のデータを書き出したりな
どがあげられる.メソッドの出口がひとつならそこで後処理を行え
ば良いことだが,いろいろな条件でreturnすることなど考えると,
なかなかそうもいかない.更にrubyには例外があるので,話はやや
こしくなってしまう.例えば,
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # なにかの処理
ruby| file.close
ruby| end
このような例で,「なにかの処理」の間に例外が発生したら,file
はcloseされずに残ってしまう.この場合,必ずfileはcloseして欲
しい.とはいえ,
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # なにかの処理
ruby| file.close
ruby| rescue
ruby| file.close
ruby| fail # 例外の再発生
ruby| end
というのもなにか複雑だし,これでは例外には対応できるが,
returnやbreakで抜ける時にはまた個別に対応しないといけない.
returnする場合毎にいちいちfileをcloseするというのも面倒な話
だ.
そういう場合のためにrubyには後処理を記述する構文がある.
beginにensure節を指定すると,その部分beginから抜ける時に必ず
実行される.
ruby> begin
ruby| file = open("/tmp/some_file", "w")
ruby| # なにかの処理
ruby| ensure
ruby| file.close
ruby| end
これでbeginを抜ける直前にかならずensureで指定された部分が実
行されるので,fileのcloseし忘れからのエラーを心配する必要は
なくなる.ついでだが,ひとつのbeginにrescueとensureの両方を
指定する時はrescueの方を先に書かなくてはいけない.