BOO大全/參考與物件
外观
< BOO大全
參考與物件
[编辑]很重要的一件事情,你必須記得,指定物件給變數並沒有發生複製的動作。所以可以有很多變數參考到同一個物件。
>>> 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 的型別上都適用,像字串、串列、陣列都行。