Bug con hash e array?

Ciao. Non ho mai scritto qui, e sono molto inesperto.

Sto usando ruby1.9.1 (ruby 1.9.1p378 (2010-01-10 revision 26273) ), e
questo codice dà risultati quanto meno bizzarri:

arr = Array.new 5,{:a=>0}
arr[0][:a] = 99
puts arr

(Il codice è stupido e inutile, lo so, l’ho scritto apposta per questo
post: il problema ovviamente è sorto con un altro script più sensato)

L’output che mi aspetterei da questo codice è:

{:a=>99}
{:a=>0}
{:a=>0}
{:a=>0}
{:a=>0}

ma quello che ottengo è

{:a=>99}
{:a=>99}
{:a=>99}
{:a=>99}
{:a=>99}

Insomma, tutti gli elementi dell’array vengono modificati, non solo
quello con indice 0. Mi sembra un comportamento decisamente poco
sensato!

Forse mi manca qualche concetto di base, perché proprio non capisco che
cosa non vada bene. Oltretutto, questo problema sorge solamente
inizializzando tutti gli elementi dell’array con un hash, almeno per
quanto ho potuto vedere io.

Ringrazio in anticipo per l’aiuto (e scusate l’eventuale “niubbata”)
Ciao

Il 31 maggio 2010 16.53, Tony P. [email protected] ha
scritto:

Ciao. Non ho mai scritto qui, e sono molto inesperto.

Sto usando ruby1.9.1 (ruby 1.9.1p378 (2010-01-10 revision 26273) ), e
questo codice dà risultati quanto meno bizzarri:

arr = Array.new 5,{:a=>0}

Ciao,

qui crei un array di 5 elementi, ognuno dei quali è l’oggetto {:a =>
0}, cioè lo stesso oggetto; in pratica, arr[0], arr[1], etc puntano
allo stesso oggetto.

Quando poi fai arr[0][:a] = 99, stai modificando quell’oggetto, che
ora avrà 99 come value in qualunque modo ci accedi.

Per capirci, considera il seguente codice:

a = {:k => 0}
b = a
c = a
d = a
d[:k] = 1

Se ora guardi a, troverai che contiene:
{:k => 1}

Invece prova:

arr = 5.times.map { { :a => 0}}
arr[0][:a] = 99

arr
=> [{:a=>99}, {:a=>0}, {:a=>0}, {:a=>0}, {:a=>0}]

pietro

Grazie mille!
Ero convinto che scrivendo

arr = Array.new 5,{:a=>0}

si creassero cinque hash nuovi, e non avevo proprio pensato a questa
faccenda.
In effetti c’era pure scritto nella documentazione (created with size
copies of obj (that is, size references to the same obj)), ma ho letto
con poca attenzione.

Ti ringrazio moltissimo per la disponibilitÃ

Ciao