BOO大全/参考与物件

上一章:杂凑(Hashes) 目录 下一章:控制结构


参考与物件

编辑

很重要的一件事情,你必须记得,指定物件给变数并没有发生复制的动作。所以可以有很多变数参考到同一个物件。

>>> a1 = (1,2,3)
(1, 2, 3)
>>> a2 = a1
(1, 2, 3)
>>> a2[0] = 0
0
>>> a1
(0, 2, 3)

在处理数值型别时,就不是如此了,因为与复制数值(通常只有4或8个bytes)比起来,复制大的物件的代价是很昂贵的。你可以在 Boo 里定义自己的值型别,当然你得有个好理由。

如果两个物件相等,这意味著他们可能是相同的物件,或是他们有相同的内容。is运算子可以告诉你这两个参考是否一样:

>>> l1 = [1,2,3]
[1, 2, 3]
>>> l2 = l1
[1, 2, 3]
>>> l3 = [1,2,3]
[1, 2, 3]
>>> l1 == l3
true
>>> l1 is l3
false
>>> l1 == l2
true
>>> l1 is l2
true

有时候你想作的是复制物件,阵列有个Clone方法,但串列却没有(这是个败笔吗?):

>>> a3 = a1.Clone()
(1, 2, 3)
>>> a3 == a1
true
>>> a3 is a1
false
>>> l1 = [1,2,3]
[1, 2, 3]
>>> l2 = l1.Clone()
------------^
ERROR: 'Clone' is not a member of 'Boo.Lang.List'.
>>> l2 = l1[:]
[1, 2, 3]

还记得前面提过的 Slicing 吗? l1[:] 表示取得串列的所有元素,这样就能复制整个串列了,这个技巧在所有可以 slicing 的型别上都适用,像字串、串列、阵列都行。


上一章:杂凑(Hashes) 目录 下一章:控制结构