Brian Candler
3/8/2007 9:19:00 AM
On Thu, Mar 08, 2007 at 04:55:11PM +0900, Alexander Fleck 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
sequence
File.open("/etc/passwd") do |f|
puts f.read
end
# 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 then,
if the user calls 'exit!')
However, if it's just a file, the operating system will close the file when
the program exits anyway.
B.