2015-05-21 14 views
9

Voglio creare un hash in Ruby con valori di default come un array vuotoCreazione di un hash con i valori come array e il valore predefinito come matrice vuota

Così, ho codificato

x = Hash.new([]) 

Tuttavia, quando ho cercare di spingere un valore in esso

x[0].push(99) 

Tutti i tasti ottenere 99 spinto in tale matrice. Come posso risolvere questo?

+1

'Hash.new {[]}' è quello che vuoi. –

+1

@CarySwoveland questo restituirà un nuovo array senza memorizzarlo nell'hash – Stefan

+0

@Stefan sul tuo telefono – Ninjinx

risposta

12

Lakshmi ha ragione. Quando hai creato l'hash con Hash.new([]), hai creato un oggetto array.

Quindi, la matrice stessa è restituito per ogni chiave nel Hash mancanti.

Ecco perché, se l'array condiviso viene modificato, il cambiamento si riflette su tutte le chiavi mancanti.

Uso:

Hash.new { |h, k| h[k] = [] } 

Crea e assegna una nuova matriceper ogni chiave mancante nella Hash, in modo che sia un oggetto unico.

15
h = Hash.new{|h,k| h[k] = [] } 

h[0].push(99) 

Questo si tradurrà in {0=>[99]}


Quando si utilizza Hash.new([]), un singolo oggetto viene utilizzato come valore di default (cioè il valore da restituire quando un hash chiave h[0] non restituisce nulla), in questo caso si array.

Quindi quando diciamo h[0].push(99), si preme 99 in tale array ma non si assegna nulla a h[0]. Quindi se produci h vedrai ancora un hash vuoto {}, mentre l'oggetto predefinito sarà [99].


considerando, quando un blocco è previsto cioè Hash.new{|h,k| h[k] = [] } viene creato un nuovo oggetto e viene assegnato a h[k] ogni volta che è richiesto un valore predefinito.

h[0].push(99) assegnerà h[0] = [] e inserirà il valore in questo nuovo array.

Problemi correlati