On 2007-01-29 18:18:31 +0100, Stefano Crocco <stefano.crocco / alice.it> said:

> Alle luned29 gennaio 2007, Josselin ha scritto:
>> I have to classify a bunch of products into 4 boxes, according to the
>> value of one of their attribute (product.code , an integer between 0
>> and 4)
>> 
>> I wrote that but it's seems wrong  :
>> 
>> box[0] = box[1] = box[2] = box[3] = []
>> 
>> for product in products
>> tag = Tag.new(product.title, product.price)
>> box[ product.code << tag
>> end
>> 
>> then I'll reuse each box[] for further processing...
>> 
>> what's wrong ?
>> 
>> tfyl
>> 
>> joss
> 
> The problem is that writing something like
> 
> a = b = c = []
> 
> will store the same array in all the variables. If you use the object_id
> methods on the four elements of box, you'll see that the returned value is
> 
> the same. This means that modifiying, for instance box[0] will also modify
> 
> box[1], box[2] and box[3], because they all contain the same object. You
> should replace the line
> 
> box[0] = box[1] = box[2] = box[3] = []
> 
> with, for example,
> 
> box=Array.new(4){[]}
> 
> This will create a new Array with four elements, each of which is a differe
> nt
> Array. Note that writing box=Array.new(4,[]) will produce the same (wrong
> )
> result as your code.
> 
> I hope this helps
> 
> Stefano

thansk a lot .. it's so DRY...

btw : I tried also

        box = []
        0.upto(4) do |i|
          box[i] = []
        end