1. 程式人生 > >1月21日 Reference數據類型

1月21日 Reference數據類型

組合 new imp line cin auto indent pla 嵌套

Reference Datat Types 引用參考數據類型 -> 組合數據類型

Array, Hash和程序員自定義的復合資料類型

組合數據的修改:

組合數據類型的變量,不是直接存值,而是存一個reference引用位置,指向另一塊真正存值的內存空間。

因為組合數據類型是個容器,這個容器可能存有非常多的數據,復制的成本是很高的。因此在默認的情況下,我們不會真的去復制它的值,而是復制引用而已。

object_id 方法 顯示內存位置

> a = [1,2,3] => [1, 2, 3] > b = a => [1, 2, 3] > a.object_id => 70317611561980 > b.object_id => 70317611561980 > a[0] = 9 => 9 > a => [9, 2, 3] > b => [9, 2, 3] > a.object_id
=> 70317611561980 > b.object_id => 70317611561980

方法調用也必須註意參數是基本類型還是引用類型:

def foo(x) 
 x = 9999 
 return x 
end 
x = 1 foo(x); 
x #=> 基本類型外部的局部變量不會被foo方法所改變

但是Reference Data Type則會被改變。

def bar(x) {
x[0] = 9999;
}
arr = [1,2,3];
bar(arr) #=> [999,2,3]



clone方法

組合數據類別的 = 指派只會復制引用,如果需要真的復制值,需要用clone

方法。

?? :Ruby內建的 clone 方法是不支援 deep clone (深度復制,嵌套內的復制)

> a = ["a", "bb"] => ["a", "bb"] > b = a => ["a", "bb"] > c = a.clone => ["a", "bb"]

> a[0]= 11 => 11 > a => [11, "bb"] > b => [11, "bb"] > c => ["a", "bb"] #=> c 是clone的值,所以不會變化。


內建的 clone 是不支援 deep clone,如果真的要復制,你需要自己寫方法。
a = [1,2,3]
b = [0, a]

c = b.clone
a[0] = 999

b
c  
b和c都會變為[0,[999,2,3]]

1月21日 Reference數據類型