# Is this a bug?

Discussion in 'Ruby' started by Vivek, Jan 12, 2006.

1. ### VivekGuest

I have the below sample program.

a=[1,2,3,1]
b=[1,[2,4],[5,6,3],4]
b.flatten!
a.push b
a.uniq!
puts a

The output it produces is
1
2
3
1
2
4
5
6
3
4

a.uniq! doesnt seem to work on the array created after appending the
flattened b array to a.
Note that uniq! has actually purged the last element '1' in the
original array a.It looks like
uniq! somehow still works on the old array a and is not aware of the
new array.
I am using 1.8.4

Vivek

Vivek, Jan 12, 2006

2. ### Gavin KistnerGuest

rb(main):001:0> a=[1,2,3,1]
=> [1, 2, 3, 1]
irb(main):002:0> b=[1,[2,4],[5,6,3],4]
=> [1, [2, 4], [5, 6, 3], 4]
irb(main):003:0> b.flatten!
=> [1, 2, 4, 5, 6, 3, 4]
irb(main):004:0> a.push b
=> [1, 2, 3, 1, [1, 2, 4, 5, 6, 3, 4]]
irb(main):005:0> a.uniq!
=> [1, 2, 3, [1, 2, 4, 5, 6, 3, 4]]
irb(main):006:0> puts a
1
2
3
1
2
4
5
6
3
4
=> nil

Pushing b onto a does not push b's *values* onto a.

Gavin Kistner, Jan 12, 2006

3. ### VivekGuest

Ah! thanks for the clarification!
Just had to one flatten after pushing b on a to acheive what I wanted.

Vivek, Jan 12, 2006
4. ### Kev JacksonGuest

ie you'd also need to flatten a after pushing on b

a=[1,2,3,1]
b=[1,[2,4],[5,6,3],4]
b.flatten!
a.push b
a.flatten!
a.uniq!
puts a

irb(main):001:0> a=[1,2,3,1]
=> [1, 2, 3, 1]
irb(main):002:0> b=[1,[2,4],[5,6,3],4]
=> [1, [2, 4], [5, 6, 3], 4]
irb(main):003:0> b.flatten!
=> [1, 2, 4, 5, 6, 3, 4]
irb(main):004:0> a.push b
=> [1, 2, 3, 1, [1, 2, 4, 5, 6, 3, 4]]
irb(main):005:0> a.flatten!
=> [1, 2, 3, 1, 1, 2, 4, 5, 6, 3, 4]
irb(main):006:0> a.uniq!
=> [1, 2, 3, 4, 5, 6]
irb(main):007:0> puts a
1
2
3
4
5
6
=> nil
irb(main):008:0>

Kev Jackson, Jan 12, 2006
5. ### Robin StockerGuest

a=[1,2,3,1]
b=[1,[2,4],[5,6,3],4]
b.flatten!
a.concat b # concat instead of push
a.uniq!
puts a

Would also do what you wanted. It's probably faster than push and flatten.

Robin

Robin Stocker, Jan 12, 2006