Velocity Reviews > Ruby > Is this a bug?

# Is this a bug?

Vivek
Guest
Posts: n/a

 01-12-2006
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

Gavin Kistner
Guest
Posts: n/a

 01-12-2006
On Jan 11, 2006, at 8:53 PM, Vivek wrote:
> 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

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.

Vivek
Guest
Posts: n/a

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

Kev Jackson
Guest
Posts: n/a

 01-12-2006
Gavin Kistner wrote:

> On Jan 11, 2006, at 8:53 PM, Vivek wrote:
>
>> 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

>
>
> 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.
>
>

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>

Robin Stocker
Guest
Posts: n/a

 01-12-2006
Vivek wrote:
> Ah! thanks for the clarification!
> Just had to one flatten after pushing b on a to acheive what I wanted.

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