Come aggiungere a un hash esistente in Ruby


102

Per quanto riguarda l'aggiunta di una key => valuecoppia a un hash popolato esistente in Ruby, sono in procinto di lavorare su Beginning Ruby di Apress e ho appena terminato il capitolo sugli hash.

Sto cercando di trovare il modo più semplice per ottenere gli stessi risultati con gli hash come questo fa con gli array:

x = [1, 2, 3, 4]
x << 5
p x

Risposte:


189

Se si dispone di un hash, è possibile aggiungervi elementi facendovi riferimento tramite chiave:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

Qui, come [ ]crea un array vuoto, { }creerà un hash vuoto.

Gli array hanno zero o più elementi in un ordine specifico, in cui gli elementi possono essere duplicati. Gli hash hanno zero o più elementi organizzati per chiave , dove le chiavi non possono essere duplicate ma possono esserlo i valori memorizzati in quelle posizioni.

Gli hash in Ruby sono molto flessibili e possono avere chiavi di quasi tutti i tipi che puoi lanciare. Questo lo rende diverso dalle strutture del dizionario che trovi in ​​altre lingue.

È importante tenere presente che la natura specifica di una chiave di un hash spesso è importante:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails confonde questo un po 'fornendo HashWithIndifferentAccess dove convertirà liberamente tra i metodi di indirizzamento Symbol e String.

Puoi anche indicizzare quasi tutto, comprese classi, numeri o altri hash.

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Gli hash possono essere convertiti in array e viceversa:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

Quando si tratta di "inserire" elementi in un hash, puoi farlo uno alla volta o utilizzare il mergemetodo per combinare gli hash:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

Nota che questo non altera l'hash originale, ma ne restituisce uno nuovo. Se vuoi combinare un hash in un altro, puoi usare il merge!metodo:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

Come molti metodi su String e Array, !indica che si tratta di un'operazione sul posto .


12
Molte informazioni preziose, ma mancano della formulazione più elementare come risposta così semplicemente da @robbrit.
danh

1
Modifica la tua risposta per rispondere effettivamente alla domanda che è stata posta, preferibilmente da qualche parte vicino all'inizio. Sarebbe scortese da parte mia farlo per te.
Stephan

@Stephan Aggiunto un esempio più conciso in alto.
tadman


34

Se vuoi aggiungerne più di uno:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash

8
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

Ho provato a implementarlo con quanto segue: x['key'] = "value"tuttavia ricevo errori. Devo menzionare che sto lavorando con le stringhe.
Tom

1
Qual è l'errore? Potrebbe essere qualsiasi cosa a meno che tu non sia più specifico.
tadman

1
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Restituisce il valore unito.

hash
 => {:a=>"a", :b=>"b"} 

Ma non modifica l'oggetto chiamante

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

La riassegnazione fa il trucco.


0
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

Potresti ottenere la chiave e il valore dall'input dell'utente, quindi puoi usare Ruby .to_sym può convertire una stringa in un simbolo e .to_i convertirà una stringa in un numero intero.
Per esempio:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

0

Puoi usare l'operatore double splat disponibile a partire da Ruby 2.0:

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.