Subscribed unsubscribe Subscribe Subscribe

close

プログラミング

Rubyではブロックとイテレータを用いてファイルを開くと,

File.open('filename') {|file|
  file.each {|line| p line}
}
[.. ファイル内容の出力 ..]
=> #<File:file.io (closed)>

となり,ブロックを抜けた時点でファイルは勝手にcloseされる.

Ioではどうなるのか調べてみた.

File clone open("filename") do(
  readLines foreach(line, line println)
)
[.. ファイル内容の出力 ..]
=> File_0x80b2940:
[.. 以下続く ..]

となり,fuserコマンドでファイルの利用状況を調べてみると,closeされていないことがわかる.従ってcloseを明記する必要があるようだ.

File clone open("filename") do(
  readLines foreach(line, line println)
) close

これでcloseされるようになる.

ファイルオブジェクトやソケットなどは,参照がない*1場合にブロックを抜けた時点で自動的にcloseして欲しい.逆に参照があるときにはcloseしないというのはどうだろうか.

つまり

// これは自動でclose
File clone open("filename") do(...)
// こっちは手動でclose
f := File clone open("filename") do(...)
f close

こんな感じになる.Rubyではどっちも自動でcloseされるが,こんな需要はないのだろうか.後で考えよう.

*1:この言い回しは正しいのだろうか? 変数に代入していないという意味.