Domanda

    

Questa domanda ha già una risposta qui:

         

Ok, quindi volevo creare un hash che ha un hash vuoto come valore predefinito. Un po 'strano, lo so, ma diciamo che ho pensato che potesse essere utile.

Quindi, ecco cosa ho fatto:

>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1

In altre parole, non vedo membro hash quando ispeziono l'hash, ma posso accedervi con la sua chiave.

Questo comportamento è previsto? Cosa sta succedendo qui?

A proposito, questo è Ruby 1.9.1, non ho provato versioni precedenti.

Modifica: esempio semplificato in quanto non deve essere un hash di hash di hash ...

È stato utile?

Soluzione

È un comportamento previsto (in tutte le versioni di ruby). E se sperimenti ancora un po ', vedrai che accedi sempre allo stesso hash, indipendentemente dalla chiave che usi:

>> a[:a][:b] = 1
=> 1
>> a[:c][:d] = 2
=> 2
>> a[:d]
=> {:b=>1, :d=>2}

Il modo in cui Hash.new con un argomento predefinito funziona è: Se si esegue hash [chiave] controlla se quella chiave esiste nell'hash. In tal caso, restituisce il valore per quella chiave. Altrimenti restituisce il valore predefinito. Non aggiunge la chiave all'hash e restituirà lo stesso oggetto predefinito (non una copia) ogni volta.

Per ottenere ciò che desideri, devi invece specificare un blocco predefinito. In questo modo, il blocco verrà eseguito ogni volta che accedi a una chiave che non è nell'hash. All'interno del blocco puoi creare un nuovo hash e impostare la chiave su " punto " a quell'hash. In questo modo:

Hash.new { |h,k|  h[k] = {} }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top