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 merge
metodo 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 .