Nested array filling bad

I try to fill a nested array this way

irb(main):001:0> cat_a = Array.new(7, Array.new)
irb(main):002:0> cat_a[0] << 0
=> [0]
irb(main):004:0> cat_a[1] << 1
=> [0, 1]

but it gives me back
irb(main):005:0> cat_a
=> [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]

I would like to get back

[ [0], [1], [], [], [], [], [] ]

and adding cat_a[0] << 9
would give

[ [0, 9], [1], [], [], [], [], [] ]

what’s wrong with my array def ?

thanks

Josselin wrote:

what’s wrong with my array def ?

--------------------------------------- Array::new
Array.new(size=0, obj=nil)
Array.new(array)
Array.new(size) {|index| block }

Returns a new array. In the first form, the new array is empty. In
the second it is created with size copies of obj (that is,
size references to the same obj).

So, you are essentially doing this:

a = Array.new
b = a
p a, b

–output:–
[]
[]

a << 1
p a, b

–output:–

[1]
[1]

Try this instead:

arr = Array.new(7) {Array.new}
arr[0] << 0
arr[1] << 1

p arr

–output:–
[[0], [1], [], [], [], [], []]

On Sep 23, 8:08 am, Josselin [email protected] wrote:

I would like to get back

[ [0], [1], [], [], [], [], [] ]

irb(main):001:0> cat_a = Array.new(7){ [] }
=> [[], [], [], [], [], [], []]
irb(main):002:0> cat_a[0] << 0
=> [0]
irb(main):003:0> cat_a[1] << 1
=> [1]
irb(main):004:0> cat_a
=> [[0], [1], [], [], [], [], []]

What’s wrong with it is that you are using the exact same array for
all 7 spots. You want a new Array to be created for each spot, using
the block notation above.

On 2007-09-23 16:23:21 +0200, 7stud – [email protected] said:

Returns a new array. In the first form, the new array is empty. In
[]

[[0], [1], [], [], [], [], []]
thanks a lot… got it

On 2007-09-24 06:23:59 +0200, Phrogz [email protected] said:

irb(main):004:0> cat_a
=> [[0], [1], [], [], [], [], []]

What’s wrong with it is that you are using the exact same array for
all 7 spots. You want a new Array to be created for each spot, using
the block notation above.

thanks a lot… got it