Se você tiver um hash, poderá adicionar itens a ele referenciando-os por chave:
hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'
Aqui, como [ ]
cria um array vazio, { }
criará um hash vazio.
Os arrays têm zero ou mais elementos em uma ordem específica, onde os elementos podem ser duplicados. Hashes têm zero ou mais elementos organizados por chave , onde as chaves não podem ser duplicadas, mas os valores armazenados nessas posições podem ser.
Hashes em Ruby são muito flexíveis e podem ter chaves de quase qualquer tipo que você possa usar. Isso o torna diferente das estruturas de dicionário que você encontra em outros idiomas.
É importante ter em mente que a natureza específica de uma chave de hash geralmente é 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 confunde isso um pouco, fornecendo HashWithIndifferentAccess, onde converterá livremente entre os métodos de endereçamento de símbolo e string.
Você também pode indexar em quase tudo, incluindo classes, números ou outros Hashes.
hash = { Object => true, Hash => false }
hash[Object]
# => true
hash[Hash]
# => false
hash[Array]
# => nil
Hashes podem ser convertidos em matrizes e vice-versa:
# 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 se trata de "inserir" coisas em um Hash, você pode fazer uma de cada vez ou usar o merge
método para combinar os hashes:
{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}
Observe que isso não altera o hash original, mas retorna um novo. Se quiser combinar um hash em outro, você pode usar o merge!
método:
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'}
Como muitos métodos em String e Array, o !
indica que é uma operação local .