コピー

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

言語によって結構ちがうものなのねぇ。
javaとかC#はどうなのだろうね。