# Array multidimensionale

**URL:** <https://www.ruby-forum.com/t/array-multidimensionale/167951>\
**Category:** IT\
**Created:** [May 14, 2009, 11:56am UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951 "2009-05-14T11:56:33Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [May 14, 2009, 11:56am UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951/1 "2009-05-14T11:56:33Z")

</div>

ciao a tutti  
intanto ruby -v  
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]  
ho uno strano comportamento su un array a 2 dimensioni;  
mi spiego con un esempio:  
v = []  
v.fill([],0…2)  
v.map {|e| e.fill(0,0…2)}  
p v  
v[1][1] = “XXXX”  
p v  
produce  
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]  
[[0, “XXXX”, 0], [0, “XXXX”, 0], [0, “XXXX”, 0]]  
ora, quello che vorrei ottenere invece Ã¨  
[[0, 0, 0], [0, “XXXX”, 0], [0, 0, 0]]  
cosa sbaglio?  
grazie fin da ora per le risposte

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [May 14, 2009, 12:01pm UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951/2 "2009-05-14T12:01:22Z")

</div>

2009/5/14 Giampiero Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> p v  
> produce  
> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]  
> [[0, “XXXX”, 0], [0, “XXXX”, 0], [0, “XXXX”, 0]]  
> ora, quello che vorrei ottenere invece è  
> [[0, 0, 0], [0, “XXXX”, 0], [0, 0, 0]]  
> cosa sbaglio?  
> grazie fin da ora per le risposte

Il problema è nel secondo elemento tutti gli elementi puntano allo stesso  
Array.  
Prova con:  
v = Array.new(2) {Array.new(0)}  
In questo modo ogni volta che inserisci un elemento crea un Array  
nuovo e non punta allo stesso array.  
Penso sia questo il problema, ma poi magari mi sbaglio! 🙂

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [May 14, 2009, 12:39pm UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951/3 "2009-05-14T12:39:34Z")

</div>

Davide Monfrecola wrote:

> Il problema ï¿½ nel secondo elemento tutti gli elementi puntano allo stesso  
> Array.  
> Prova con:  
> v = Array.new(2) {Array.new(0)}  
> In questo modo ogni volta che inserisci un elemento crea un Array  
> nuovo e non punta allo stesso array.  
> Penso sia questo il problema, ma poi magari mi sbaglio! 🙂

ciao Davide e grazie per la risposta  
in effetti mi sa che hai ragione anche se non capisco fino in fondo…  
comunque, seguendo il tuo consiglio, ho modificato come segue e ora  
funziona  
v = Array.new(3) {Array.new(3) {0}}  
p v  
v[1][1] = ‘XXXX’  
p v  
produce  
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]  
[[0, 0, 0], [0, “XXXX”, 0], [0, 0, 0]]

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [May 17, 2009, 2:14pm UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951/4 "2009-05-17T14:14:34Z")

</div>

> in effetti mi sa che hai ragione anche se non capisco fino in fondo…

Non so se sia utile a chiarire i tuoi ultimi dubbi, ma quando scrivo  
v=[]  
v.fill(Array.new, 0…2)

sto riempiendo v con degli elementi che puntano tutti allo stesso array.  
Quando modifico un elemento qualisasi di v vengono modificati di  
conseguenza anche tutti gli altri.  
Posso verificare l’esattezza di quanto dico controllando l’object\_id  
degli elementi:  
v.each{|e| puts e.object\_id}

che risulteranno tutti uguali (puntano quindi tutti allo stesso oggetto)

Se poi scrivo  
v.map{|arr| arr.fill(0, 0…2)}

sto facendo un lavoro inutile in quanto la ricorsione modifica sempre lo  
stesso oggetto.  
Basterebbe un semplice  
v[0].fill(0, 0…2)

per modificare tutti gli elementi dell’array, senza scomodare la  
ricorsione.

A questo punto dovrebbe essere chiaro che scrivere  
v[1][1] = ‘xxx’

modificherÃ non solo v[1][1], ma anche v[0][1] e v[2][1] poiche’ v[0],  
v[1], v[2] sono lo stesso oggetto.

Per ottenere quello che avevi in mente tu invece avrei dovuto  
inizializzare v cosÃ¬:

v= Array.new(3){[]}  
v.map …  
…

infatti ora  
v.each{|e| puts e.object\_id}

restituisce valori diversi, quindi ogni elemento punta ad un array  
diverso.

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [May 19, 2009, 9:01am UTC](https://www.ruby-forum.com/t/array-multidimensionale/167951/5 "2009-05-19T09:01:22Z")

</div>

Andrea L. wrote:

> > in effetti mi sa che hai ragione anche se non capisco fino in fondo…
> 
> Non so se sia utile a chiarire i tuoi ultimi dubbi, ma quando scrivo  
> v=[]  
> v.fill(Array.new, 0…2)
> 
> sto riempiendo v con degli elementi che puntano tutti allo stesso array.  
> grazie Andrea  
> in effetti ora mi Ã¨ piÃ¹ chiaro  
> in futuro,quando sicuramente ripeterÃ² l’errore, per lo meno sarÃ² colto  
> dal dubbio e saprÃ² quale direzione prendere per rimediare  
> ciao a tutti
