how to copy array in ruby

Discussion in 'Ruby' started by PIKI, Nov 13, 2009.

  1. PIKI

    PIKI Guest

    HI

    I am a novice in Ruby programming so this question might look trivial
    to lot of people.

    But I am struggling to copy an array.

    I am using

    a = []
    b = a

    /* some manipulation here on "b" and "a" I havent touched at all*/

    Here when i am trying to see contents of "a" and "b" both have same
    contents

    But my expectation was they shud be different

    Instead of b = a, I also tried b.replace(a)

    but no luck here also.

    Please help me on how to make a duplicate("b") of "a" so that changes
    done on b will not affect a

    Thanks
    Pikender Sharma
    PIKI, Nov 13, 2009
    #1
    1. Advertising

  2. On Fri, Nov 13, 2009 at 2:30 PM, PIKI <> wrote:

    > But I am struggling to copy an array.
    >
    > I am using
    >
    > a = []
    > b = a
    >
    > /* some manipulation here on "b" and "a" I havent touched at all*/
    >
    > Here when i am trying to see contents of "a" and "b" both have same
    > contents
    >
    > But my expectation was they shud be different
    >
    > Instead of b = a, I also tried b.replace(a)
    >
    > but no luck here also.
    >
    > Please help me on how to make a duplicate("b") of "a" so that changes
    > done on b will not affect a


    irb(main):001:0> a = [1,2,3,4]
    => [1, 2, 3, 4]
    irb(main):002:0> b = a.dup
    => [1, 2, 3, 4]
    irb(main):003:0> b[0] = 55
    => 55
    irb(main):004:0> a
    => [1, 2, 3, 4]
    irb(main):005:0> b
    => [55, 2, 3, 4]

    Hope this helps,

    Jesus.
    Jesús Gabriel y Galán, Nov 13, 2009
    #2
    1. Advertising

  3. PIKI

    PIKI Guest

    On Nov 13, 6:34 pm, Jesús Gabriel y Galán <>
    wrote:
    > On Fri, Nov 13, 2009 at 2:30 PM, PIKI <> wrote:
    > > But I am struggling tocopyanarray.

    >
    > > I am using

    >
    > > a = []
    > > b = a

    >
    > > /* some manipulation here on "b" and "a" I havent touched at all*/

    >
    > > Here when i am trying to see contents of "a" and "b" both have same
    > > contents

    >
    > > But my expectation was they shud be different

    >
    > > Instead of b = a, I also tried b.replace(a)

    >
    > > but no luck here also.

    >
    > > Please help me on how to make a duplicate("b") of "a" so that changes
    > > done on b will not affect a

    >
    > irb(main):001:0> a = [1,2,3,4]
    > => [1, 2, 3, 4]
    > irb(main):002:0> b = a.dup
    > => [1, 2, 3, 4]
    > irb(main):003:0> b[0] = 55
    > => 55
    > irb(main):004:0> a
    > => [1, 2, 3, 4]
    > irb(main):005:0> b
    > => [55, 2, 3, 4]
    >
    > Hope this helps,
    >
    > Jesus.- Hide quoted text -
    >
    > - Show quoted text -


    Hi Jesús Gabriel y Galán

    Thanks for the reply and help

    I tried ur solution but it is also not working :(

    I am unable to figure out the trick

    Thanks
    Pikender Sharma
    PIKI, Nov 14, 2009
    #3
  4. PIKI

    lith Guest

    > I tried ur solution but it is also not working :(
    >
    > I am unable to figure out the trick


    In order to help us to figure out what is the problem, you might want
    to post a code snippet demonstrating the defect and explain what how
    you would expect ruby to behave.

    Array#dup creates a copy of the array, not of the elements in the
    array, aka a shallow copy.
    lith, Nov 14, 2009
    #4
  5. l> Array#dup creates a copy of the array, not of the elements in the
    l> array, aka a shallow copy.

    Is there a way to make a deep copy? That is ... in the code below,
    could b.dup be replaced with something like b.deepdup?


    irb(main):019:0> a1 = [1,2,3,4]
    => [1, 2, 3, 4]
    irb(main):020:0> b = [a1,5]
    => [[1, 2, 3, 4], 5]
    irb(main):021:0> c1 = b
    => [[1, 2, 3, 4], 5]
    irb(main):022:0> c2 = b.dup
    => [[1, 2, 3, 4], 5]
    irb(main):023:0> a1[0] = "hi"
    => "hi"
    irb(main):024:0> a1
    => ["hi", 2, 3, 4]
    irb(main):025:0> c1
    => [["hi", 2, 3, 4], 5]
    irb(main):026:0> c2
    # because of the shallow copy, c2[0][0] is "hi" instead of a naively
    # assumed 1.
    => [["hi", 2, 3, 4], 5]
    irb(main):027:0> c1[1] = "bye"
    => "bye"
    irb(main):028:0> c1
    => [["hi", 2, 3, 4], "bye"]
    irb(main):029:0> c2
    # The shallow copy gives the expected result for c2[1], below.
    => [["hi", 2, 3, 4], 5]
    Ralph Shnelvar, Nov 14, 2009
    #5
  6. you can make it via this method "clone" b =3D a.clone
    Am 14.11.2009 um 11:25 schrieb PIKI:

    > On Nov 13, 6:34 pm, Jes=FAs Gabriel y Gal=E1n =

    <>
    > wrote:
    >> On Fri, Nov 13, 2009 at 2:30 PM, PIKI <> wrote:
    >>> But I am struggling tocopyanarray.

    >>
    >>> I am using

    >>
    >>> a =3D []
    >>> b =3D a

    >>
    >>> /* some manipulation here on "b" and "a" I havent touched at all*/

    >>
    >>> Here when i am trying to see contents of "a" and "b" both have same
    >>> contents

    >>
    >>> But my expectation was they shud be different

    >>
    >>> Instead of b =3D a, I also tried b.replace(a)

    >>
    >>> but no luck here also.

    >>
    >>> Please help me on how to make a duplicate("b") of "a" so that =20
    >>> changes
    >>> done on b will not affect a

    >>
    >> irb(main):001:0> a =3D [1,2,3,4]
    >> =3D> [1, 2, 3, 4]
    >> irb(main):002:0> b =3D a.dup
    >> =3D> [1, 2, 3, 4]
    >> irb(main):003:0> b[0] =3D 55
    >> =3D> 55
    >> irb(main):004:0> a
    >> =3D> [1, 2, 3, 4]
    >> irb(main):005:0> b
    >> =3D> [55, 2, 3, 4]
    >>
    >> Hope this helps,
    >>
    >> Jesus.- Hide quoted text -
    >>
    >> - Show quoted text -

    >
    > Hi Jes=FAs Gabriel y Gal=E1n
    >
    > Thanks for the reply and help
    >
    > I tried ur solution but it is also not working :(
    >
    > I am unable to figure out the trick
    >
    > Thanks
    > Pikender Sharma
    >
    Derrick Fiedler, Nov 14, 2009
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Venkat
    Replies:
    4
    Views:
    963
    Venkat
    Dec 5, 2003
  2. Replies:
    4
    Views:
    13,395
    Old Wolf
    Aug 13, 2004
  3. Alex
    Replies:
    2
    Views:
    1,205
  4. Replies:
    26
    Views:
    2,094
    Roland Pibinger
    Sep 1, 2006
  5. Marcus
    Replies:
    25
    Views:
    1,607
    Francesco
    Aug 19, 2009
Loading...

Share This Page