配列のコピー

Array#cloneないしはArray#dupを使います。

foo = [1, 2, 3, 4, 5]
bar = foo.clone

foo[0] = 100

p foo # [100, 2, 3, 4, 5]
p bar # [1, 2, 3, 4, 5]

この場合浅いコピーなので、片方の配列の要素に対する操作がもう片方の配列の要素に影響する場合があります。

hoge = (1..3).map {|i|
    (1..3).map {|j|
      i * j
    }
}
fuga = hoge.clone

hoge[0][0] = 100

p hoge # [[100, 2, 3], [2, 4, 6], [3, 6, 9]]
p fuga # [[100, 2, 3], [2, 4, 6], [3, 6, 9]]

このような場合には深いコピーが必要になります。コピーするための処理を自前で書くかMarshal.dumpMarshal.loadを利用します。

src = (1..3).map {|i|
    (1..3).map {|j|
      i * j
    }
}
dest = Marshal.load(Marshal.dump(src))
src[0][0] = 100

p src # [[100, 2, 3], [2, 4, 6], [3, 6, 9]]
p dest # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

関連項目