Gli hash, istanze della classe Hash, sono liste di coppie di chiavi e valori. A differenza degli array invece degli indici numerici, che identificano la posizione nell'array dell'elemento, negli hash troviamo delle chiavi che possono essere di tipo qualsiasi. In Ruby gli hash sono racchiusi tra parentesi graffe e ogni coppia e separata dall'altra da una virgola, mentre tra le chiavi e i valori ci deve essere il simbolo =>
Come gli array anche gli hash possono essere creati in vari modi, innanzitutto scrivendo direttamente le coppie chiave-valore tra parentesi graffe
> hsh = {"nome" => "Lev", "patronimico" => "Nikolaevic", "cognome" => "Tolstoj"} => {"cognome"=>"Tolstoj", "nome"=>"Lev", "patronimico"=>"Nikolaevic"}
in alternativa si può utilizzare il metodo []
> hsh = Hash["nome", "Ivan", "patronimico", "Sergeevic", "cognome", "Turgenev"] => {"cognome"=>"Turgenev", "nome"=>"Ivan", "patronimico"=>"Sergeevic"}
o anche, unendo i modi precedenti, per maggiore chiarezza:
> hsh = Hash["nome" => "Fedor", "patronimico" => "Michajlovic", "cognome" => "Dostoevskij"] => {"cognome"=>"Dostoevskij", "nome"=>"Fedor", "patronimico"=>"Michajlovic"}
Infine è possibile creare un hash vuoto con il metodo new
> hsh = Hash.new => {}
tale hash va poi popolato, come abbiamo visto per gli array, con il metodo []= con la differenza che invece dell'indice va indicata la chiave:
> hsh["nome"] = "Vladimir" => "Vladimir" > hsh["patronimico"] = "Vladimirovic" => "Vladimirovic" > hsh["cognome"] = "Majakovskij" => "Majakovskij" > hsh => {"cognome"=>"Majakovskij", "nome"=>"Vladimir", "patronimico"=>"Vladimirovic"}
La stessa sintassi si utilizza per accedere ai valori con il metodo []. Per elencare invece tutte le chiave e i valori di un hash si utilizzano i metodi keys
e values
:
> hsh.keys => ["cognome", "nome", "patronimico"] > hsh.values => ["Majakovskij", "Vladimir", "Vladimirovic"]
È possibile inoltre indicare un valore di default che viene restituito qualora si utilizza una chiave non esistente:
> hsh.default = "errore!" => "errore!" > hsh["nazionalità"] => "errore!"
Tale valore può essere impostato anche al momento della creazione passando il valore di default come argomento a new
.
Oltre a buona parte degli iteratori che abbiamo visto per gli array, gli hash ne hanno di propri che permettono di sfruttare al meglio la loro struttura.
Oltre a each
, che in questo caso passa al blocco sia la chiave che il valore come parametri, abbiamo i metodi each_key
e each_value
che rispettivamente passano la chiave e il valore al blocco che viene eseguito come al solito su ogni elemento:
> hsh = {"nome" => "Lev", "patronimico" => "Nikolaevic", "cognome" => "Tolstoj"} > hsh.each {|k, v| puts "#{k}: #{v}"} cognome: Tolstoj nome: Lev patronimico: Nikolaevic > hsh.each_key {|k| puts k} cognome nome patronimico > hsh.each_value {|v| puts v} Tolstoj Lev Nikolaevic
Tipico degli hash è anche il metodo has_value?
che restituisce true se il valore passato come argomento è presente nell'hash. Analogamente, ma per le chiavi, opera has_key?
. Rimando come al solito alla documentazione ufficiale per l'elenco completo dei metodi della classe Hash.