Hashes
O próximo grupo que vamos olhar é a Hash.
Hashes são uma generalização das arrays. Em vez de apenas permitir índices, como em array[3], as hashes permitem que qualquer objeto seja utilizado como um "índice". Portanto, você pode escrever hash["name"]
Suponha que eu queira guardar algumas informações sobre um amigo. Eu poderia utilizar um array, como este:
friend = [ "Jeffrey", "Biggs", "34 Airport Rd",
"Toronto", "Ontario"
]
|
Isso poderia funcionar, mas gostaria de ter em mente que friend[0] é o primeiro nome, friend[1] é o último nome e assim por diante. Isso pode começar a ficar bem complicado.
Este é exatamente o tipo de problema que uma hash pode ajudar. Esta é a forma de definir uma hash:
friend = {
"first name" => "Jeffrey",
"last name" => "Biggs",
"address" => "34 Airport Rd",
"city" => "Toronto",
"province" => "Ontario"
}
|
Assim como arrays, você pode adicionar mais tarde um outro campo assim:
friend["country"] = "Canada"
|
|
Atenção:
Observe que criamos hashes usando {chaves} enquanto que
[colchetes] usamos para arrays.
|
Alguma terminologia: keys (chaves) e values (valores)
Como as hashes não usam índices numéricos, nós usamos a palavra keys (chaves) no lugar. Os objetos aos quais as keys se referem são chamadas values (valores).
No exemplo abaixo, as chaves são "first name", "last name" e "city". Seus respectivos valores são "Jeffrey", "Biggs" e "Toronto".
Iteração com hashes
Hashes também fazem iteração.
Hash#each
As hashes tem o método Hash#each, similar ao Array#each. Este métodos, no entanto, abastece tanto a chave quanto o valor.
friend.each do |key, value|
puts key + " => " + value
end
|
Isso produz:
city => Toronto
last name => Biggs
country => Canada
province => Ontario
address => 34 Airport Rd
first name => Jeffrey
|
Neste ponto temos um tropeço das hashes. Os dados numa hash não são armazenados numa ordem em particular. A razão disso é porque Ruby não sabe que "first name" vem antes de "city"? Nem sempre.
A melhor maneira de resolver problemas assim é criar uma classe para isso. Ruby é uma linguagem excelente para criar suas classes. Mas antes disso, temos que ver outras coisas. Criação de classes e métodos é o tópico do próximo capítulo.
Hash#each_pair é sinônimo de Hash#each.
Hash#each_key
O nome diz tudo. Este método itera usando todas as chaves, como Arrah#each.
>> friend.each_key do |key|
?> puts key
>> end
city
last name
country
province
address
first name
|
Hash#each_value
Itera usando todos os valores.
>> friend.each_value do |val|
?> puts val
>> end
Toronto
Biggs
Canada
Ontario
34 Airport Rd
Jeffrey
|