/ / Comprensione della creazione di hash: rubino

Comprensione della creazione di hash: rubino

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 № 1

Hash.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