Sono molto nuovo a Ruby ed io "sto cercando di capire la seguente creazione di hash:
hash = Hash.new { |hash, key| hash[key] = [] }
Come posso interpretarlo? La sintassi (il contenuto del blocco) non mi è ancora chiara.
risposte:
2 per risposta № 1Hash.new
- Stai chiamando il costruttore di Hash
{ |hash, key| hash[key] = [] }
- stai passando questo blocco al costruttore. Questo blocco dice all'Hash: quando incontri una chiave sconosciuta, crea una nuova coppia chiave / valore, con quella chiave come chiave e una matrice vuota appena assegnata come valore.
hash =
- Stai assegnando il nuovo hash a questa variabile, ma non usare hash
come nome variabile! È già il nome di un metodo su ogni oggetto le cui sottoclassi di classe Object
.
C'è anche una notazione più semplice:
Hash.new([])
ma raramente ciò che si desidera, perché a) tutti i riferimenti a chiavi inesistenti condivideranno lo stesso array e b) non determinerà la creazione di alcuna coppia chiave / valore:
2.3.0 :001 > h = Hash.new([])
=> {}
2.3.0 :002 > h[:a] << 1
=> [1]
2.3.0 :003 > h[:b]
=> [1]
2.3.0 :004 > h.keys.include? :a
=> false
2.3.0 :005 > h.keys
=> []
Riguardo la sintassi di |hash, key|
, quel frammento ha esattamente lo stesso scopo dell'elenco degli argomenti tra parentesi di un metodo, ad es. (hash, key)
nel codice qui sotto:
def f(hash, key)
hash[key] = []
end