码迷,mamicode.com
首页 > 其他好文 > 详细

1月21日 Reference数据类型

时间:2018-01-21 12:34:44      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:back   组合   isp   ant   import   内存   数据   mono   types   

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数据类型

标签:back   组合   isp   ant   import   内存   数据   mono   types   

原文地址:https://www.cnblogs.com/chentianwei/p/8323546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!