# Bug con hash e array?

**URL:** <https://www.ruby-forum.com/t/bug-con-hash-e-array/189414>\
**Category:** IT\
**Created:** [May 31, 2010, 4:53pm UTC](https://www.ruby-forum.com/t/bug-con-hash-e-array/189414 "2010-05-31T16:53:22Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![tnyplz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@tnyplz](https://www.ruby-forum.com/u/tnyplz)\
**Post date:** [May 31, 2010, 4:53pm UTC](https://www.ruby-forum.com/t/bug-con-hash-e-array/189414/1 "2010-05-31T16:53:22Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![tnyplz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@tnyplz](https://www.ruby-forum.com/u/tnyplz)\
**Post date:** [May 31, 2010, 5:12pm UTC](https://www.ruby-forum.com/t/bug-con-hash-e-array/189414/2 "2010-05-31T17:12:45Z")

</div>

Il 31 maggio 2010 16.53, Tony P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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

---

<div class="post-metadata">

**Author:** ![tnyplz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@tnyplz](https://www.ruby-forum.com/u/tnyplz)\
**Post date:** [May 31, 2010, 5:18pm UTC](https://www.ruby-forum.com/t/bug-con-hash-e-array/189414/3 "2010-05-31T17:18:19Z")

</div>

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
