2009-11-05 6 views
4

Quelle est la meilleure façon (appropriée) de partager une instance de logger entre plusieurs classes ruby?Partager global logger parmi le module/classes

À l'heure actuelle, je viens de créer l'enregistreur en tant que variable globale $ logger = Logger.new, mais j'ai le sentiment qu'il existe une meilleure façon de le faire sans utiliser de var globale.

Si je donne les résultats suivants:

module Foo 
    class A 
    class B 
    class C 
    ... 
    class Z 
end 

quelle est la meilleure façon de partager les instances de l'enregistreur parmi toutes les classes? Est-ce que je déclare/crée l'enregistreur dans le module Foo d'une façon ou d'une autre ou utilise juste l'amende globale $ logger?

Répondre

9

Ajouter une constante dans le module:

module Foo 
    Logger = Logger.new 
    class A 
    class B 
    class C 
    ... 
    class Z 
end 

Ensuite, vous pouvez faire Logger.log('blah') dans vos classes. Comme nous observons la constante globale Logger avec Foo::Logger, cela signifie que si vous voulez vous référer à la classe Logger dans le module Foo, vous devez utiliser la résolution de portée: ::Logger.

+0

obtenu "enregistreur variable locale ou méthode' non définie » pour .." avec votre code .. – skywinder

0

Vous pouvez créer un enregistreur singleton pour votre application, de sorte que chaque référence se rapporte au même objet.

require 'singleton' 

class Logger 
    include Singleton 
end 

l = Logger.instance 
k = Logger.instance 

puts k.object_id == l.object_id #returns true 
+4

S'il vous plaît lire [ "L'enregistreur Chainsaw Infanticide manuever"] (http://groups.google.com/group/ comp.lang.ruby/browse_frm/thread/aaec68ab9088e3ef/d0f054886e0bf71c? lnk = gst & q = tronçonneuse # d0f054886e0bf71c) [sic] avant de transformer Logger en singleton pour tout le monde. Sous-classe d'abord, ou (comme le suggère Pesto dans une autre réponse) créer une constante pointant vers une instance que vous aimez. – Phrogz