On Tue, Feb 20, 2007 at 08:48:07AM +0900, Raymond O'connor wrote:
> I'm trying to write a logger class.  I open the file in the initialize
> method.  Is there a destructor that I can override to close the file, or
> can I just assume the file is closed automatically?
> 
> Am I going about this all wrong, and should instead just open and close
> the file each time I write to it?
> 
Ruby has no destructors (there are these things called finalizers, but
in general it's best to pretend they don't exist).

The usual idiom for a file (or any resource that needs to be released)
is:

File.open(path, read_or_write) do |file|
   # use file
end # The file will be closed

The way to implement something like that is to define a method like:

def open
  resource = Resource.new
  begin 
    yield( resource ) # pass the resource into the block
  ensure # code in an ensure block always gets run, even if an exception
         # is raised
    resource.release
  end
end

open { |res| res.use } 

Unfortunately a logger doesn't work well with this idiom.

You could provide an explicit teardown method for the logger and call it
when the program ends, or use the block based idiom:

Logger.new do |logger|
  ... whole program ...
end

but that strikes me as awkward. The other option is the at_exit method.
It gets supplied a block to be run when the program exits, so in your
initalize you could do:

def initialize
  @file = File.open(path, "w")
  at_exit { @file.close }
end


Finally, on a parting note, are you aware that ruby's standard library
has a logger? Just require 'logger'.

> Thanks,
> Ray
> 
> -- 
> Posted via http://www.ruby-forum.com/.