2008年03月13日

ブロックでクローズいらず!

open("c:\\okinawaa.csv") {|f| f.each {|line| print line }}
↑のようにopenメソッドにブロックを渡すとクローズ処理はいりません。ブロックを定義することにより、ファイルハンドルのスコープが明確になり、ガベージコレクト(GC)できるようですね。

ただ、
open("c:\\okinawa.csv").each {|line| print line }
では、駄目です。クローズ処理が必要です。これだとeachメソッドにブロックを渡しているだけなので、ファイルハンドルのスコープが不明確なのですね。

ちなみに、

begin
s = open("c:\\okinawa.csv") {|f|
s = f
f.each {|line|
print line
raise "fake error!\n"
}
}
rescue => e
print "Error!!" + e
print s.closed? #=>true
end

としてブロック内で例外を発生させてみたら、ちゃんとクローズしてくれていました。なかなか賢いですね。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 18:57| Comment(0) | TrackBack(0) | 技術メモ(Ruby)