[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Nested array filling bad..

Josselin

9/23/2007 2:09:00 PM

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



4 Answers

7stud 7stud

9/23/2007 2:23:00 PM

0

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-....

Phrogz

9/24/2007 4:24:00 AM

0

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.

Josselin

9/24/2007 10:19:00 AM

0

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

Josselin

9/24/2007 10:19:00 AM

0

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]
> [1]
>
>
> Try this instead:
>
> arr = Array.new(7) {Array.new}
> arr[0] << 0
> arr[1] << 1
>
> p arr
>
> --output:--
> [[0], [1], [], [], [], [], []]

thanks a lot.. got it