On Thu, Mar 08, 2007 at 04:55:11PM +0900, Alexander F. wrote:
I wrote an extension that uses a file to handle an external device. The
initialize method opens the file and it then is permanently open. I don’ t
want to open and close it every time I write to it.
I wondered how to finalize the object or to close the file when my script
ends. Currently the file keeps open and I have an open unused device.
I’d recommend you copy the way that Ruby’s File class does it.
(1) Provide a ‘close’ method on your object, for the user to be able to
explicitly close it when needed.
(2) Provide a block-based method, which does an open / yield / close
File.open("/etc/passwd") do |f|
# file is now closed at this point
(preferred implementation is to use begin … ensure … end, so that the
close is called even if an exception occurs when the yield is called)
(3) Let the files close themselves when the program exits.
I stumbled over the function ‘rb_io_fptr_finalize’, but I didn’ t find a
real reference which tells me if that’ s what I searched for or not.
As I understand it, finalisers are called when the object is
garbage-collected. However there’s not guarantee that an object will be
garbage-collected at any time before the program exits (and not even
if the user calls ‘exit!’)
However, if it’s just a file, the operating system will close the file
the program exits anyway.