Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

a deepcopy for "array = [1,2,3]*5"?

1 view
Skip to first unread message

Boris

unread,
May 23, 2005, 8:18:16 AM5/23/05
to
Been looking this up in the myriad of deepcopy strands, but couldn't
find it in 30 minutes, so I'm posting the question.

The question is simple. What way would you create an array that
contains 5 copies of an array, without the copies interfering with each
other?

array = [1,2,3]*5

generates:
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]

but unfortunately also makes 'array[1][1] = "a"' change it like this:

[[1,"a",3],[1,"a",3],[1,"a",3],[1,"a",3],[1,"a",3]]

---------
Anyway, found a solution during tinkering, although I don't know why.
Thought I'd just still post it anyway.

ar = []
5.times{ar << [1,2,3]}

works, and 'array[1][1] = "a"' results in the thing I want

[[1,2,3],[1,"a",3],[1,2,3],[1,2,3],[1,2,3]]

Brian Schröder

unread,
May 23, 2005, 8:29:01 AM5/23/05
to

For me [1,2,3]*5 behaves different.

irb(main):001:0> [1,2,3]*5
=> [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]


For what you want you could use:

irb(main):002:0> a = Array.new(5) { [1,2,3] }
=> [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
irb(main):003:0> a[1][1] = 'a'
=> "a"
irb(main):004:0> a
=> [[1, 2, 3], [1, "a", 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]

Which version of ruby are you using?

best regards,

Brian Schröder

--
http://ruby.brian-schroeder.de/

Stringed instrument chords: http://chordlist.brian-schroeder.de/


Florian Frank

unread,
May 23, 2005, 8:28:08 AM5/23/05
to
On 2005-05-23 21:20:17 +0900, Boris wrote:
> The question is simple. What way would you create an array that
> contains 5 copies of an array, without the copies interfering with each
> other?

array = Array.new(5) { [1,2,3] }

--
Florian Frank


Premshree Pillai

unread,
May 23, 2005, 10:58:43 AM5/23/05
to
On 5/23/05, Brian Schröder <ruby....@gmail.com> wrote:
> For me [1,2,3]*5 behaves different.
>
> irb(main):001:0> [1,2,3]*5
> => [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

He prolly meant [[1, 2, 3]]*5

--
Premshree Pillai


0 new messages