2006-10-28
オブジェクトのコピー
b = a と書いて変数に変数を代入してもオブジェクトの複製が作られるわけではない。 b = a というのは a が示すオブジェクトに b という別名をつけているに過ぎない。
a = 'abc' b = a a.upcase! p a #=> "ABC" p b #=> "ABC"
a と b は同じオブジェクトにつけられた名前だ。まったく同じものを指している。a の実体は b の実体なので a が指し示すオブジェクトを破壊的に書き換えれば当然 b の内容も書き換わったことになる。
dup メソッドでオブジェクトのコピーを作り出すことができる。
a = 'abc' b = a.dup a.upcase! p a #=> "ABC" p b #=> "abc"
※ dup に似たメソッドに clone があるがその違いはリファレンスを参照されたい。
この場合 dup を使わなくても次のように書けば同じような結果が得られる。
a = 'abc' b = a a = a.upcase #=> updase の戻り値に新たに a という名前をつける p a #=> "ABC" p b #=> "abc"
経験上 dup が必要になるケースは少ない。