2012-02-02 13 views
29

Qualcuno può mostrarmi un modo rubino di controllare se una chiave esiste in un hash e se non lo fornisce, allora dargli un valore predefinito. Sto assumendo che ci sia un solo liner con cui non farlo, ma non sono sicuro di cosa usare.Se la chiave non esiste creare il valore predefinito

risposta

11

Se non è necessario memorizzare il valore di default in hash è possibile utilizzare il metodo Hash#fetch:

hash = {} 
hash.fetch(:some_key, 'default-value') # => 'default-value' 
p hash 
# => {} 

Se è necessario, oltre a conservare il valore di default ogni volta che si accede chiave inesistente e si 're quello inizializzazione l'hash è possibile farlo utilizzando Hash#new con un blocco:

hash = Hash.new { |hash, key| hash[key] = 'default-value' } 
hash[:a] = 'foo' 
p hash[:b] 
# => 'default-value' 
p hash 
# => { :a => 'foo', :b => 'default-value' } 
15

Costruttore di classe hash accettare un valore di default, lo stesso verrà restituito se un tasto corrispondente non viene trovato.

h = Hash.new("default") 

h.has_key?("jake") 
=> false 

h["jake"] 
=> "default" 

h["jake"] = "26" 
h.has_key?("jake") 
=> true 
43

Se si dispone già di un hash, si può fare questo:

h.fetch(key, "default value") 

Oppure si sfruttare il fatto che una chiave non esistente tornerà nil:

h[key] || "default value" 

Per creare hash con valori predefiniti dipende da cosa vuoi fare esattamente.

  • indipendente di chiave e non verranno memorizzate:

    h = Hash.new("foo") 
    h[1] #=> "foo" 
    h #=> {} 
    
  • seconda della chiave e verrà memorizzato:

    h = Hash.new { |h, k| h[k] = k * k } 
    h[2] #=> 4 
    h #=> {2=>4} 
    
+2

Utilizzo di h [chiave] || "valore predefinito" non è salvato, se c'è già falso in esso sarà sovrascritto – Sebastian

+0

Ecco perché l'ho elencato come una delle varie possibilità. Generalmente le persone hanno un'idea di quali saranno i valori dei loro hash, se sai che non salverai i valori booleani, è un approccio perfetto. –

3

Se si memorizza un valore predefinito potrebbe essere nullo e devi calcolarlo al momento dello stoccaggio:

hash = {} 
... 
hash.fetch(key) {|k| hash[k] = calc_default()} 
1

Se si desidera assegnare il valore di default per l'hash se la chiave non esiste (ancora), è possibile utilizzare l'operatore ||=, vale a dire:

h = {some_key: 'non_default_value'} 
value = h[:some_key] ||= 'default_value' 
value2 = h[:non_existing_key] ||= 'default_value' 

value saranno assegnati 'non_default_value' e value2 sarà assegnare 'default_value'

Dopo queste assegnazioni h avrà il non_existing_key insieme a 'default_value':

{:some_key=>"non_default_value", :non_existing_key=>"default_value"}

Problemi correlati