Ruby で配列コピーするときに Marshal を使う
Ruby
Published: 2019-04-14

やったこと

Ruby で配列コピーするときに、うまくいかない場合がありました。

Marshal を使ってコピーして解決しました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

c1 = [
    1, 2, 3
]

c2 = c1

c2[0] = 9999999
p c2[0]
p c1[0]

実行結果

$ ruby test.rb
9999999
9999999

どうやら変数の c1 と c2 は同じ参照を持っているようです。 違う方法でコピーすることにします。

test2.rb

c3 = [
    1, 2, 3
]
c4 = Marshal.load(Marshal.dump(c3))
c3[0] = 9999999
p c3[0]
p c4[0]

実行結果

$ ruby test2.rb
9999999
1

うまくいきました。