Robert Klemme
1/29/2007 6:49:00 PM
On 29.01.2007 19:20, Josselin wrote:
> On 2007-01-29 18:18:31 +0100, Stefano Crocco <stefano.crocco@alice.it>
> 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