How to copy array in ruby

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

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.

···

On Fri, Nov 13, 2009 at 2:30 PM, PIKI <avid.piks@gmail.com> 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

Hi Jesús Gabriel y Galán

Thanks for the reply and help

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

I am unable to figure out the trick

Thanks
Pikender Sharma

···

On Nov 13, 6:34 pm, Jesús Gabriel y Galán <jgabrielyga...@gmail.com> wrote:

On Fri, Nov 13, 2009 at 2:30 PM, PIKI <avid.p...@gmail.com> 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 -

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

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.

you can make it via this method "clone" b = a.clone

···

Am 14.11.2009 um 11:25 schrieb PIKI:

On Nov 13, 6:34 pm, Jesús Gabriel y Galán <jgabrielyga...@gmail.com> > wrote:

On Fri, Nov 13, 2009 at 2:30 PM, PIKI <avid.p...@gmail.com> 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 :frowning:

I am unable to figure out the trick

Thanks
Pikender Sharma

Array#dup creates a copy of the array, not of the elements in the
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:

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?

If the contents of the array are marshalable, you can
try the idiomatic Marshal.dump/Marshal.load cycle:

array = [[:a1, :a2], :b]

=> [[:a1, :a2], :b]

dup = array.dup

=> [[:a1, :a2], :b]

dup[0] << :a3

=> [:a1, :a2, :a3]

dup

=> [[:a1, :a2, :a3], :b]

array

=> [[:a1, :a2, :a3], :b]

deep = Marshal.load Marshal.dump(array)

=> [[:a1, :a2, :a3], :b]

deep[0] << :a4

=> [:a1, :a2, :a3, :a4]

deep

=> [[:a1, :a2, :a3, :a4], :b]

array

=> [[:a1, :a2, :a3], :b]

— Shot

···

--
Add argentinas-dst-2009.diff: Disable DST switch for Argentina tomorrow,
as the Argentina government decided yesterday. Careful planning is boring.
                     [Martin Pitt, tzdata 2009n-0ubuntu0.9.04.1 changelog]