From: Robert Klemme Date: 2007-01-30T03:50:06+09:00 Subject: Re: classification On 29.01.2007 19:20, Josselin wrote: > On 2007-01-29 18:18:31 +0100, Stefano Crocco > said: > >> Alle luned� 29 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 > Much more convenient is this: box = Hash.new {|h,k| h[k] = []} Now you can just do for product in products tag = Tag.new(product.title, product.price) box[ product.code ] << tag end Kind regards robert