Hashes (dicionários)
Hashes (também conhecidos como arrays associativos, mapas ou dicionários) são similares aos arrays a medida que são coleções indexadas de referências a objetos. No entanto, enquanto o o array é indexado por inteiros (semelhante a um índice remissivo), o hash pode ser indexado com objetos de qualquer tipo: strings, expressões regulares e assim por diante. Quando você armazena um valor em um hash, você na verdade fornece dois objetos – o índice (normalmente chamado de chave) e o valor desse índice. É possível recuperar os valores utilizando o índice do hash. Os valores do hash, assim como os índices, podem ser objetos de qualquer tipo.
O exemplo 040myhash.rb abaixo cria um hash com literais (strings): uma lista de pares chave => valor entre
1 # p040myhash.rb 2 h = {'cachorro' => 'canino', 'gato' => 'felino', 3 'burro' => 'asinino', 12 => 'dodezino'} 4 puts h.length # 4 5 puts h['cachorro'] # 'canino' 6 puts h 7 puts h[12]
A saída do código acima é:
1 >ruby p040myhash.rb 2 4 3 canino 4 {"cachorro"=>"canino", "gato"=>"felino", 5 "burro"=>"asinino", 12=>"dodezino"} 6 dodezino 7 >Exit code: 0
Caso o programa apresentado no exemplo seja executado no Ruby 1.8 a saída será um pouco diferente. Em todos exemplos estamos utilizando o Ruby 1.9, no qual o hash é apresentado de forma ordenada e igual a sua declaração. Já no Ruby 1.8 a ordenação do hash é diferente da declarada
Comparados com arrays, os hashes têm uma vantagem significativa: eles podem usar qualquer objeto como índice.
Hashes têm um valor padrão. Tal valor é retornado após uma tentativa de acesso a uma chave não existente. Por padrão este valor é nil.
A classe Hash tem muitos métodos e você pode consultá-los aqui (em inglês).
Ao invés, de utilizar uma string como chave, de preferência pelo uso de um símbolo. Veja o exemplo a seguir no programa p041symbolhash.rb.
1 # p041symbolhash.rb 2 pessoa = Hash.new 3 pessoa[:apelido] = 'GuruIndiano' 4 pessoa[:idioma] = 'Marata' 5 pessoa[:sobrenome] = 'Talim' 6 puts pessoa[:sobrenome] # Talim
Outro exemplo p0411symbolhash.rb.
1 # p0411symbolhash.rb 2 h = {:apelido => 'GuruIndiano', :idioma => 'Marata', :sobrenome => 'Talim'} 3 puts h
A saída do exemplo acima é:
1 {:apelido=>"GuruIndiano", :idioma=>"Marata", :sobrenome=>"Talim"}
Outra maneira de fazer a mesma coisa é mostrada no programa p0412symbolhash.rb.
1 # p0412symbolhash.rb 2 h = {apelido: 'GuruIndiano', idioma: 'Marata', sobrenome: 'Talim'} 3 puts h
A saída é:
1 {:apelido=>"GuruIndiano", :idioma=>"Marata", :sobrenome=>"Talim"}
Ou seja, exatamente o mesmo que ocorreu na execução do programa p0411symbolhash.rb.
O último exemplo (p0412symbolhash.rb) não funcionará no Ruby 1.8. Ele utiliza uma sintaxe nova para declarar hashes introduzida no Ruby 1.9.
Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.
Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto