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