我在這裏試圖改變的A1與B1的價值,但它顯示VAL不能重新分配編譯時錯誤。如果我不能像這樣改變,那麼它如何做到這一點。瓦爾不能互換的樂趣被重新分配,在樂趣局部變量編譯時錯誤科特林
fun swap(a1: String, b1: String) {
val temp = a1
a1 = b1
b1 = temp
}
注:這只是一個樣本知道爲什麼我不能夠重新分配局部變量,我們可以用Java做
我在這裏試圖改變的A1與B1的價值,但它顯示VAL不能重新分配編譯時錯誤。如果我不能像這樣改變,那麼它如何做到這一點。瓦爾不能互換的樂趣被重新分配,在樂趣局部變量編譯時錯誤科特林
fun swap(a1: String, b1: String) {
val temp = a1
a1 = b1
b1 = temp
}
注:這只是一個樣本知道爲什麼我不能夠重新分配局部變量,我們可以用Java做
在科特林val
聲明最後,只讀,參考 - 而這正是編譯器錯誤是告訴你
瓦爾不能重新分配
一旦指定值val
,它不能改變。如果你想能夠重新分配它,你必須聲明它爲var
在Kotlin方法參數被隱式聲明爲final,所以你不能像在Java中一樣重新指定它們。
但是你的代碼中的核心錯誤是你試圖交換方法參數。由於方法參數是按值傳遞的,而不是通過引用傳遞的,所以你想在Kotlin中實現的是不可能的(就像Java中不可能的那樣)。即使您將在方法調用中重新分配參數,傳遞給該方法的原始變量也不會改變。
,所以Kotlin劑量支持重新分配要改變的參數值,因爲我已經創建了一個新的var temp = a1 temp = b1 – YLS
你能改正這個答案。 'val'不是一個常量也不是一成不變的,它是一個最終的參考,使用mutable/immutable可以誤導任何引用指向的內容。他的錯誤不是直接關於'val',而是關於Kotlin中總是「最終」的參數。 –
有兩種誤解位置:
首先,在科特林所有的參數都是final
,這不能改變。就像在Java中一樣,final
引用不能改變。因此,當您嘗試重新分配final
或val
參考時出現錯誤。
其次,因爲你必須爲String的引用的副本,您的交換功能會對主叫方的原引用沒有影響。您的交換功能也不適用於Java。
例如,調用你的代碼做什麼:
val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2) // Java or Kotlin, doesn't matter
println(s1)
println(s2)
// output:
// howdy
// goodbye
,肯定有文字或表情叫什麼都不做:
swap("happy","day") // what references is it supposed to be swapping?
你只能換一個對象裏面的內容爲這你持有與調用者相同的參考。爲了使交換程序,你會做這樣的事情:
data class MutablePair(var one: String, var two: String)
fun swap(pair: MutablePair) { // not thread safe
val temp = pair.one
pair.one = pair.two
pair.two = temp
}
,你可以撥打:
val stringies = MutablePair("howdy", "goodbye")
println("${stringies.one} ${stringies.two}")
swap(MutablePair()
println("${stringies.one} ${stringies.two}")
// output:
// howdy goodbye
// goodbye howdy
只是一個側面說明:您'swap'功能不會做任何事情。 – glee8e
函數參數是本地的,並且對它們的賦值(這在Java中是不禁止的)不會改變函數之外的任何東西。此外,您可以將任意表達式傳遞給函數e。 G。交換(9,42)'。這項任務可能看起來很混亂,因此在Kotlin中被禁止。 –