[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

classification

Josselin

1/29/2007 5:00:00 PM

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

3 Answers

Stefano Crocco

1/29/2007 5:19:00 PM

0

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 different
Array. Note that writing box=Array.new(4,[]) will produce the same (wrong)
result as your code.

I hope this helps

Stefano

Josselin

1/29/2007 6:21:00 PM

0

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



Robert Klemme

1/29/2007 6:49:00 PM

0

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