コピー
twitterで誰かがしゃべってて、よくわかんなかった。混乱したので
確認。会社の先輩にわかんねぇ。。とかこの話題をしてみたら、
「君の理解が甘いのだよ!」っとか言われた。フヒヒ。ちっ。
rubyだとオブジェクトをcloneすると参照値がコピーされる
オブジェクトが持つインスタンス変数が参照ならその参照値がコピーされる。
だってインスタンスが持ってるのは参照値だものって事っぽい
数値はcloneでつながりが途切れる。あれ?全てがオブジェクトっていうのは
全てが参照値ベースですってこととは別問題なのですかね?
class DeepTest def initialize @arr = [0,1,2] @var = 1 end attr_accessor :arr,:var def ech p @arr p @var end end m = DeepTest.new m.ech #参照を代入して s = m #変化させる s.arr.map!{|e| e + 10 } s.var = 10 m.ech #クローンして d = m.clone #変化させる d.arr.map!{|e| e + 10 } d.var = 100 m.ech
[0, 1, 2] 1 [10, 11, 12] 11 [110, 111, 112] 11
phpのcloneは再帰的にやってくれるらしい
<?php class DeepTest { public $hoge; public $fuga; public function __construct() { $this->hoge = array(0); $this->fuga = 0; } public function ech() { echo var_dump($this->hoge) . " fuga->" . $this->fuga . "\n"; } } $m1 = new DeepTest(); echo "moto 1 \n"; $m1->ech(); $s1 = $m1; $s1->hoge[0] = 10; $s1->fuga = 1; $m1->ech(); $d1 = clone($m1); $d1->hoge[0] = 100; $d1->fuga = 10; $m1->ech(); ?>
moto 1 array(1) { [0]=> int(0) } fuga->0 array(1) { [0]=> int(10) } fuga->1 array(1) { [0]=> int(10) } fuga->1