Ruby Language Accesso ai valori

Esempio

I singoli valori di un hash vengono letti e scritti usando i metodi [] e []= :

my_hash = { length: 4, width: 5 }

my_hash[:length] #=> => 4

my_hash[:height] = 9

my_hash #=> {:length => 4, :width => 5, :height => 9 }

Per impostazione predefinita, l'accesso a una chiave che non è stata aggiunta all'hash restituisce nil , il che significa che è sempre possibile tentare di cercare il valore di una chiave:

my_hash = {}

my_hash[:age] # => nil

Gli hash possono anche contenere chiavi nelle stringhe. Se si tenta di accedere normalmente, verrà restituito un valore nil , ma sarà possibile accedervi tramite le relative chiavi stringa:

my_hash = { "name" => "user" }

my_hash[:name]    # => nil
my_hash["name"]   # => user

Per le situazioni in cui sono previste o necessarie le chiavi, gli hash hanno un metodo di fetch che genera un'eccezione quando si accede a una chiave che non esiste:

my_hash = {}

my_hash.fetch(:age) #=> KeyError: key not found: :age

fetch accetta un valore predefinito come secondo argomento, che viene restituito se la chiave non è stata precedentemente impostata:

my_hash =  {}
my_hash.fetch(:age, 45) #=> => 45

fetch può anche accettare un blocco che viene restituito se la chiave non è stata precedentemente impostata:

my_hash = {}
my_hash.fetch(:age) { 21 } #=> 21

my_hash.fetch(:age) do |k|
  puts "Could not find #{k}"
end

#=> Could not find age

Gli hash supportano anche un metodo store come alias per []= :

my_hash = {}

my_hash.store(:age, 45)

my_hash #=> { :age => 45 }

Puoi anche ottenere tutti i valori di un hash utilizzando il metodo dei values :

my_hash = { length: 4, width: 5 }

my_hash.values #=> [4, 5]

Nota: questo è solo per Ruby 2.3+ #dig è utile per gli Hash nidificati. Estrae il valore nidificato specificato dalla sequenza di oggetti idx chiamando dig a ogni passaggio, restituendo nil se qualsiasi passaggio intermedio è nullo.

h = { foo: {bar: {baz: 1}}}

h.dig(:foo, :bar, :baz)   # => 1
h.dig(:foo, :zot, :xyz)   # => nil

g = { foo: [10, 11, 12] }
g.dig(:foo, 1)            # => 11