簡體   English   中英

Val無法在kotlin中為局部變量重新分配編譯時錯誤

[英]Val cannot be reassigned compile time error for local variable in fun in kotlin

這里有趣的交換我試圖用b1更改a1的值,但它顯示val無法重新分配編譯時錯誤。 如果我不能像這樣改變那么它是如何做到的。

fun swap(a1: String, b1: String) {
   val temp = a1
   a1 = b1
   b1 = temp
}

注意:這只是一個示例,可以知道為什么我無法像在java中那樣重新分配局部變量

在Kotlin中, val聲明final,read only,reference - 這正是編譯器錯誤告訴你的

Val無法重新分配

val賦值后,無法更改。 如果您希望能夠重新分配它,則必須將其聲明為var

在Kotlin方法中,參數被隱式聲明為final val ,因此您無法像在Java中那樣重新分配它們。

但是代碼中的核心錯誤是您嘗試交換方法參數。 由於方法參數是按值傳遞的,而不是通過引用傳遞的,因此在Kotlin中不可能實現(在Java中不可能)。 即使你在方法調用內部重新分配參數,傳遞給方法的原始變量也不會改變。

這里有兩個誤解:

首先,在Kotlin中,所有參數都是final並且不能更改。 就像在Java中一樣, final引用不能改變。 因此,在嘗試重新分配finalval引用時會出錯。

其次,由於您擁有對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

您無法更改函數參數值,而是為交換值創建新變量:

fun swap(a1: String, b1: String) {
    val a1Swapped = b1
    val b1Swapped = a1
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM