Ruby Language Modifica di chiavi e valori


Esempio

Puoi creare un nuovo hash con le chiavi o i valori modificati, infatti puoi anche aggiungere o eliminare i tasti, usando inject (AKA, reduce ). Ad esempio per produrre un hash con chiavi stringificate e valori maiuscoli:

fruit = { name: 'apple', color: 'green', shape: 'round' }
# => {:name=>"apple", :color=>"green", :shape=>"round"}

new_fruit = fruit.inject({}) { |memo, (k,v)| memo[k.to_s] = v.upcase; memo }

# => new_fruit is {"name"=>"APPLE", "color"=>"GREEN", "shape"=>"ROUND"}

Hash è un enumerabile, in sostanza una raccolta di coppie chiave / valore. Pertanto ha metodi come each , map e inject .

Per ogni coppia chiave / valore nell'hash viene valutato il blocco dato, il valore del memo alla prima esecuzione è il valore seme passato per inject , nel nostro caso un hash vuoto, {} . Il valore del memo per le valutazioni successive è il valore restituito della valutazione dei blocchi precedenti, questo è il motivo per cui modifichiamo il memo impostando una chiave con un valore e quindi restituendo il memo alla fine. Il valore di ritorno della valutazione dei blocchi finali è il valore di ritorno inject , nel nostro caso memo .

Per evitare di dover fornire il valore finale, puoi utilizzare invece each_with_object :

new_fruit = fruit.each_with_object({}) { |(k,v), memo| memo[k.to_s] = v.upcase }

O anche la mappa :

1.8
new_fruit = Hash[fruit.map{ |k,v| [k.to_s, v.upcase] }]

(Vedi questa risposta per maggiori dettagli, incluso come manipolare gli hash sul posto.)