blog.waterlow.work

Ruby, Rails, js, etc...

【ruby】破壊的操作がなければdupは使って良さそう

最近rubydupというメソッドを使いました。dupと言うのはオブジェクトの”コピー”を作るのですが、一般的には以下の様な懸念点が有ります。

簡単に言うと

a = ["foo", "bar", "baz"]
b = a.dup
a[0].upcase!
p a #=> ["FOO", "bar", "baz"]
p b #=> ["FOO", "bar", "baz"]

オブジェクト自体は新しいものですが、インスタンス変数(配列の要素)の参照先が同じであるためこのようなことが起こっているようです。 オブジェクトを破壊的に変更しない場合にはそのようなことは起きない。

a = ["foo", "bar", "baz"]
b = a.dup
a[0] = a[0].upcase
p a #=> ["FOO", "bar", "baz"]
p b #=> ["foo", "bar", "baz"]

なので破壊的操作が存在しないFixnumやシンボル、真偽値等は特に気にせずdupして問題なさそう。

あと、この辺確かめるためにobject_idを使っていろいろしらべていたけど、以下のFixnumのオブジェクトIdの決め方の話が面白そう。