classification

J

Josselin

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
 
S

Stefano Crocco

Alle luned=EC 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] =3D box[1] =3D box[2] =3D box[3] =3D []

for product in products
tag =3D Tag.new(product.title, product.price)
box[ product.code=A0] << tag
end

then I'll reuse each box[] for further processing...

what's wrong ?

tfyl

joss

The problem is that writing something like

a =3D b =3D c =3D []

will store the same array in all the variables. If you use the object_id=20
methods on the four elements of box, you'll see that the returned value is=
=20
the same. This means that modifiying, for instance box[0] will also modify=
=20
box[1], box[2] and box[3], because they all contain the same object. You=20
should replace the line

box[0] =3D box[1] =3D box[2] =3D box[3] =3D []

with, for example,

box=3DArray.new(4){[]}

This will create a new Array with four elements, each of which is a differe=
nt=20
Array. Note that writing box=3DArray.new(4,[]) will produce the same (wrong=
)=20
result as your code.

I hope this helps

Stefano
 
J

Josselin

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 = []
end
 
R

Robert Klemme

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 = []
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top