Is this a bug?

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

  1. Vivek

    Vivek Guest

    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
    #1
    1. Advertisements

  2. 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
    #2
    1. Advertisements

  3. Vivek

    Vivek Guest

    Ah! thanks for the clarification!
    Just had to one flatten after pushing b on a to acheive what I wanted.
     
    Vivek, Jan 12, 2006
    #3
  4. Vivek

    Kev Jackson Guest

    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
    #4
  5. 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
    #5
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.