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], , , , , ]
--
Posted via http://www.ruby-forum.com/\.

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 Sep 23, 8:08 am, Josselin <josse...@wanadoo.fr> wrote:

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], , , , , ]

thanks a lot.. got it

···

On 2007-09-24 06:23:59 +0200, Phrogz <phrogz@mac.com> said:

On Sep 23, 8:08 am, Josselin <josse...@wanadoo.fr> wrote:

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], , , , , ]

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.

thanks a lot.. got it

···

On 2007-09-23 16:23:21 +0200, 7stud -- <dolgun@excite.com> said:

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]

Try this instead:

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

p arr

--output:--
[[0], [1], , , , , ]