![](/img/trans.png)
[英]Does function parameter behaves like a val type of variable in 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
引用不能改變。 因此,在嘗試重新分配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
您無法更改函數參數值,而是為交換值創建新變量:
fun swap(a1: String, b1: String) {
val a1Swapped = b1
val b1Swapped = a1
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.