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
Alle lunedì 29 gennaio 2007, Josselin ha scritto:
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
On 2007-01-29 18:18:31 +0100, Stefano C. [email protected]
said:
tag = Tag.new(product.title, product.price)
should replace the line
)
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
On 29.01.2007 19:20, Josselin wrote:
box[0] = box[1] = box[2] = box[3] = []
tfyl
box=Array.new(4){[]}
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