コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsでDeepCopyしたい場合はdeep_dupのほうが確実

hoge.dup で大丈夫!と思っていたらそうではなかったのでメモ

dupだと何が起きるか

要素そのものを操作されると影響を受けてしまう

# 元の配列をつくり、複製を .dup で作る
array = ["first"]
#=> ["first"]
dup_array = array.dup
#=> ["first"]

# 複製配列に要素を足す、元配列に影響がないことを確認する
dup_array.push("two")
#=> ["first", "two"]
array
#=> ["first"]
dup_array
#=> ["first", "two"]

# 複製配列の要素を直接書き換える、今回はgsub!で置き換え
dup_array.first.gsub!('first',"one")
=> "one"

# 元の配列にも影響がでている
dup_array
#=> ["one", "two"]
array
#=> ["one"]

ActiveSupportのdeep_dupを使う

配列などを複製する場合はdeep_dupを使うとそれらの憂いは無くなる。

array = ["first"]
#=> ["first"]
dup_array = array.deep_dup
#=> ["first"]

dup_array.push("two")
#=> ["first", "two"]
dup_array.first.gsub!('first',"one")
#=> "one"

array
#=> ["first"]
dup_array 
#=> ["one", "two"]

関連リンク