Gli hash in Ruby
Gli hash (detti anche array associativi) sono dei costrutti sostanzialmente simili agli array ma a differenza di questi utilizzano un'indicizzazione differente, non basata soltanto sui numeri interi.
Se i valori all'interno dei comuni vettori sono associati a degli indici che vanno da o a n, negli hash un indice può essere invece di qualsiasi tipo come per esempio una stringa o un'espressione regolare.
Nel momento in cui si vuole salvare un valore all'interno di un hash, è quindi necessario indicare sia l'indice che il valore ad esso associato; ne consegue che sarà possibile richiamare lo stesso valore facendo riferimento al suo indice.
Facciamo un piccolo esempio:
# gli hash in Ruby
# definiamo l'hash
h = {'fiore' => 'flora', 'animale' => 'fauna'}
puts h['animale'] # stampa "fauna"
puts h['fiore'] #stampa "flora"
L'hash che abbiamo definito nell'esempio è molto semplice, presenta soltanto due valori a cui sono associati due indici stringa che è possibile richiamare per ottenere le relative ad essi voci associate.
Da un hash si possono ricavare numerose informazioni interessanti, ad esempio quella riferita al numero dei valori presenti e alle diverse associazioni tra chiavi e valori; prendiamo come esempio questo semplice hash:
# recuperare informazioni da un hash
# definiamo l'hash
h = {'mare' => 'acqua', 'Eolo' => 'nano', 10 => 'Carla'}
puts h.length
puts h['Eolo']
puts h
puts h[10]
Una volta eseguito il nostro piccolo script restituirà i seguenti valori:
3 # il numero delle coppie di indici/valori in hash nano # la chiave associata al valore "Eolo" mareacquaEolonano10Carla # tutte le coppie di indici/valori Carla # valore associato ad un indice numerico interoDa notare come nell'esempio siano stati utilizzati indici di diversa natura, stringhe e interi; per quanto riguarda l'indice intero si noti come esso sia sintatticamente coerente con l'attribuzione di valori numerici alle variabili; perchè rappresenti un numero e non una stringa è infatti necessario che non venga digitato tra apici.
Negli hash troviamo un vantaggio rispetto agli array, è possibile utilizzare indici arbitrari da associare ai valori. Vi è però anche uno svantaggio, gli hash non sono ordinati quindi sono più difficili da utilizzare quando non se ne conosce la composizione interna. Se non conosciamo gli indici sarà infatti difficile poterne richiamare i valori.
Tra l'altro per gli hash è previsto un valore di default, "nil" (ne abbiamo già parlato in precedenza), che viene restituito quando si cerca di accedere a indici non presenti nell'hash:
# chiamata ad indici inesistenti
# definiamo l'hash
h = {'a' => 'b', 'c' => 'd', 'e' => 'f'}
puts h['g'] # stampa "nil"
L'esempio proposto stamperà semplicemente "nil", infatti l'indice "g" non è presente nel nostro hash.
In luogo di stringhe e numeri interi, gli hash accettano anche l'utilizzo di simboli per la definizione degli indici:
# hash con simboli come indici # definiamo l'hash capoluoghi = Hash.new capoluoghi[:Lazio] = 'Roma' capoluoghi[:Campania] = 'Napoli' capoluoghi[:Sardegna] = 'Cagliari' puts capoluoghi[:Sardegna] # stampa "Cagliari"Si noti come la definizione dell'hash sia stata effettuata associando al nome dello stesso la chiamata alla classe omonima:
capoluoghi = Hash.newIn Ruby Hash è infatti una classe nativa per la quale il linguaggio mette a disposizione numerosi metodi.







