2008-11-25 1 views
4

j'ai une classe rubis de base:Ruby: définition de hachage de niveau de classe avec des valeurs par défaut

class LogEntry 

end 

et ce que je voudrais faire est de pouvoir définir un hachage avec quelques valeurs comme ceci:

EntryType = { :error => 0, :warning => 1, :info => 2 } 

afin que je puisse accéder aux valeurs comme celui-ci (ou quelque chose de similaire):

LogEntry.EntryType[:error] 

est-ce possible dans Ruby? Est-ce que je vais à ce sujet dans le bon sens?

Répondre

7

Vous pouvez le faire:

class LogEntry 
    EntryType = { :error => 0, :warning => 1, :info => 2 } 
end 

Mais vous voulez faire référence comme

LogEntry::EntryType[:error] 
+1

Alors que cela importe seulement si la première lettre est en majuscule ou non, je crois qu'il est plus idiomatique Ruby d'utiliser ENTRY_TYPE au lieu de EntryType pour une constante. CamelCase est généralement utilisé pour les noms de modules et de classes uniquement. – nertzy

+1

Aussi, si vous ne voulez pas que l'objet Hash soit modifié sur place, vous voudrez faire ENTRY_TYPE = {: error => 0,: warning => 1,: info => 2} .freeze – nertzy

1

Sinon, vous pouvez faire une méthode de classe:

class LogEntry 

    def self.types 
    { :error => 0, :warning => 1, :info => 2 } 
    end 

end 

# And a simple test 
LogEntry.types[:error].should be_an_instance_of(Hash) 
0

Pourquoi avez-vous besoin d'un hacher?

Ne pouvez-vous pas simplement déclarer les types d'entrée sur la classe LogEntry?

class LogEntry 
    @@ErrorType = 0 
End 

LogEntry.ErrorType 
0

Je suis curieux de savoir pourquoi vous ne pouvez pas simplement faire de @error_type une variable d'instance sur les instances LogEntry?

class LogEntry 
    attr_reader :type 
    ERROR_RANKING = [ :error, :warning, :info, ] 
    include Comparable 

    def initialize(type) 
    @type = type 
    end 

    def <=>(other) 
    ERROR_RANKING.index(@type) <=> ERROR_RANKING.index(other.type) 
    end 
end 

entry1 = LogEntry.new(:error) 
entry2 = LogEntry.new(:warning) 

puts entry1.type.inspect 
#=> :error 
puts entry2.type.inspect 
#=> :warning 
puts((entry1 > entry2).inspect) 
#=> false 
puts((entry1 < entry2).inspect) 
#=> true 

Mais voir aussi Ruby construit dans la bibliothèque de l'exploitation forestière, Logger.