Forum: Ruby changing array values

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.
Andrew S. (Guest)
on 2009-04-14 00:41
What I'd like is an array of objects, each of which contains an array of
integers, and each successive object in the array should contain a
slightly different array of integers than the previous object.

For some reason, when I run the code below:

class TEST
  def initialize(args)
    @args = args
  end
  def describe
    return @args.join(", ")
  end
end


def test
  old = [0,0,0,0,0,0]
  tests = []
  5.times do |i|
    new = old
    new[rand(old.size)] = rand(5) # randomly changes one of the members
of the array to a number from 0 to 4
    tests[i] = TEST.new(new)
    puts tests[i].describe
  end
  return tests
end

I get this output:

0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 1
0, 0, 0, 0, 0, 4
0, 0, 0, 2, 0, 4
0, 0, 1, 2, 0, 4
[#<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]>,
#<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]>,
#<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]>,
#<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]>,
#<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]>]

As you can see, each object in the object array contains the last array
of integers, even though the objects are being initialized with
different arrays of integers.

Strangely enough, if I use a single integer everywhere I here use an
array, everything works just fine.

I cannot for the life of me figure out why this is happening and would
be extremely grateful it if someone could enlighten me . . .
James C. (Guest)
on 2009-04-14 00:46
(Received via mailing list)
>
>  end
> [#<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]>,
> #<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]>,
> #<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]>,
> #<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]>,
> #<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]>]



When you set 'new = old', you're just creating another reference to the
same
array. To copy the array, use 'new = old.dup'. (dup = duplicate)
Andrew S. (Guest)
on 2009-04-14 00:51
James C. wrote:
>>
>>  end
>> [#<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]>,
>> #<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]>,
>> #<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]>,
>> #<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]>,
>> #<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]>]
>
>
>
> When you set 'new = old', you're just creating another reference to the
> same
> array. To copy the array, use 'new = old.dup'. (dup = duplicate)


Ahh, fantastic! Thank you.
This topic is locked and can not be replied to.