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
方法调用也必须注意参数是基本类型还是引用类型:
但是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]]