Forum: Ruby classification

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6b2144362fffd4f71cca755d4045846f?d=identicon&s=25 Josselin (Guest)
on 2007-01-29 18:08
(Received via mailing list)
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
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2007-01-29 18:19
(Received via mailing list)
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
6b2144362fffd4f71cca755d4045846f?d=identicon&s=25 Josselin (Guest)
on 2007-01-29 19:26
(Received via mailing list)
On 2007-01-29 18:18:31 +0100, Stefano Crocco <stefano.crocco@alice.it>
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
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2007-01-29 19:51
(Received via mailing list)
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
This topic is locked and can not be replied to.