我正在學習 kotlin 概念,并且在閱讀 Arrays 主題時遇到了以下問題。
我創造了一個空
val empty = arrayOf<Int>()
empty[0] = 2
因此,上面的代碼將失敗并導致 ArrayIndexOutOfBoundsException,這是有道理的,因為陣列的大小無法更改,并且由于陣列初始化時沒有大小,因此它被視為空陣列。
這是我認為這變得有趣的地方
var emptyArray = arrayOf<Int>()
emptyArray = 1
emptyArray = 2
上面的代碼沒有失敗,當我列印專案時,我得到了結果。我假設在嘗試將元素添加到索引而不是直接添加時發生了一些事情,但我找不到任何檔案來解釋引擎蓋下發生的事情。有人可以解釋一下嗎
uj5u.com熱心網友回復:
這是因為 Kotlin 的增強賦值運算子是如何多載的。
對于賦值操作,例如 a = b,編譯器執行以下步驟:
- 如果右欄中的功能可用:
- [...]
- 否則,嘗試生成代碼
a = a b(這包括型別檢查: 的型別a b必須是 的子型別a)。
“右列的函式”是指表格的右列,我沒有在引號中包含,基本上是運算子函式plusAssign,minusAssign等timesAssign。當然,這些函式對于陣列不存在,所以第二個專案符號點在這里適用。
要為 生成代碼a = a b,需要有一個plus陣列運算子函式,獲取該陣列的一個元素,并回傳一個陣列,以便將其轉換為a = a.plus(b)。確實有這樣的算Array<T>子函式。
operator fun <T> Array<T>.plus(element: T): Array<T>
所以總結一下:
emptyArray = 1
被翻譯成
emptyArray = emptyArray 1
這被翻譯成:
emptyArray = emptyArray.plus(1)
uj5u.com熱心網友回復:
在第二個示例中, 運算子呼叫一個名為 的函式plus,然后將結果分配回變數。
查看定義給出了以下功能:
/**
* Returns an array containing all elements of the original array and then the given [element].
*/
public actual operator fun <T> Array<T>.plus(element: T): Array<T> {
val index = size
val result = java.util.Arrays.copyOf(this, index 1)
result[index] = element
return result
}
如您所見,制作了原件的副本,但更大。然后將新元素分配給新的空槽。
在示例中,總共分配了三個陣列。首先是一個空陣列,然后是一個 1 大小的陣列,最后是一個 2 大小的陣列,這就是最終結果。每個陣列仍然不能改變它的大小。
請注意,您必須使用var,并且val會導致“val cannot be reassigned”錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/443737.html
上一篇:Kotlin:用回圈重復影片x次
