Forum: Ruby Class variables and how to set them up only once.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Kyle S. (Guest)
on 2007-07-26 23:31
(Received via mailing list)
I'm trying to share a File object with everything that inherits from
Superclass, for logging.

I'm trying to come up with a nice clean way of handling this, and this
isn't it:
Right now it's doing a begin/rescue/end to see if the @@logger.nil?
(which throws an error if it doesn't exist), and setup @@logger in the
rescue.

The other thought I had was to take the setupLogger out of initialize,
have a single dummy instance of SuperPage, and call setupLogger from
that class once.  That seems even worse.

I'm sure other people can think of more elegant ways of handling this,
and I'd sure like to hear their suggestions :)

I tried putzing around with class_variables, but I couldn't seem to
get at those from within a class.


--Kyle

class SuperPage
    def initialize()
    #lots of stuff
    setupLogger()#setsup an @@logger member that the log methods use
    ObjectSpace.define_finalizer(self,
SuperPage.create_finalizer(@@logger))
  end

  def logError(message)
    log(:Error,message)
    throw :assertion_error
  end

  def log(type,message)
    @@logger.puts("#{...ugly long string that includes the message...}")
  end

  def setupLogger(path="c:\\#{DateTime.now.to_s.gsub(':','-')}.xml")
    begin
      @@logger.nil?
    rescue
      puts "I'm setting up the logger, you should only see me once"
      @@logger=File.new("c:\\#{DateTime.now.to_s.gsub(':','-')}.xml","w")
      @@logger.puts "<log>"
      @loggerSetup=true
    end
  end
end
Kyle S. (Guest)
on 2007-07-26 23:37
(Received via mailing list)
And after I said I couldn't find a way of getting at class_variables
from inside the class, the obvious occurred to me, whether or not it's
the 'right' way.
self.class.class_variables
Kyle S. (Guest)
on 2007-07-26 23:40
(Received via mailing list)
Right, so the way I wrote previously, or this way:

def setupLogger(path="c:\\#{DateTime.now.to_s.gsub(':','-')}.xml")
    unless self.class.class_variables.include?"@@logger"
      puts "I'm setting up the logger, you should only see me once"
      @@logger=File.new("c:\\#{DateTime.now.to_s.gsub(':','-')}.xml","w")
      @@logger.puts "<log>"
      @loggerSetup=true
    end
end
unknown (Guest)
on 2007-07-27 00:23
(Received via mailing list)
Hi --

On Fri, 27 Jul 2007, Kyle S. wrote:

> Right, so the way I wrote previously, or this way:
>
> def setupLogger(path="c:\\#{DateTime.now.to_s.gsub(':','-')}.xml")
>   unless self.class.class_variables.include?"@@logger"
>     puts "I'm setting up the logger, you should only see me once"
>     @@logger=File.new("c:\\#{DateTime.now.to_s.gsub(':','-')}.xml","w")
>     @@logger.puts "<log>"
>     @loggerSetup=true
>   end
> end


What about:

   @@logger ||= File.new ....


David
Robert K. (Guest)
on 2007-07-27 00:27
(Received via mailing list)
On 26.07.2007 21:30, Kyle S. wrote:
> I'm trying to share a File object with everything that inherits from
> Superclass, for logging.

> The other thought I had was to take the setupLogger out of initialize,
> have a single dummy instance of SuperPage, and call setupLogger from
> that class once.  That seems even worse.
>
> I'm sure other people can think of more elegant ways of handling this,
> and I'd sure like to hear their suggestions :)

There is at least one logging package for Ruby (Log4R).  I'd use that
one instead of creating my own.

Kind regards

  robert
Kyle S. (Guest)
on 2007-07-27 00:40
(Received via mailing list)
dblack,
         I've never tried to use ||= before... but damn if that
doesn't work well!  I was expecting it to die like my @@whatever=:this
unless @@whatever had when I tried that.  Neat!


Robert,
         I've found the docs for log4r to be slightly better than
those for well.. umm.  nothing.  There about the worst docs I've found
for a widely used package ;)  I've used log4r in other projects
several months ago, but didn't feel like going through the pain of
setting it up and re-learning it.  While it's a good lib, the docs are
horrible.

Thanks,
         Kyle
This topic is locked and can not be replied to.