"Shannon Fang" <xrfang / hotmail.com> wrote in message

> Surprised, eh ?
> I'm indeed surprised by this piculiar behavior.  I used the solution you
> suggested, it worked fine. tks. But I don't understand why?

The way I see it is by understanding that if  you make the second argument
of Array.new to be another array
(like Array.new(3,Array.new)), only one instance of the Array  is created
and its ** reference ** is copied across all the elements.

So, just as
Array(3,0)                 will create   [0,0,0]
Array(3, Array.new)  will create   [[],[],[]]
But all the three arrays in this case ^^^^^
will be refering to only ONE instance (object).
Hence changing any one of them will change all three !

The same logic applies when you do Array.new(3, Array(3, Array.new))

If you study the second solution carefully, you will see that it forces you
to create distinct objects every time. No messing with the references. Hence
you can change any one object without affecting the others.

And as pointed to by David, this can be all done in  the single line

a = (1..3).collect { [0,0,0]}
p a          # will give   [[0,0,0],[0,0,0],[0,0,0]]

HTH,
-- shanko