2017-05-26 38 views
3

我在這裏試圖改變的A1與B1的價值,但它顯示VAL不能重新分配編譯時錯誤。如果我不能像這樣改變,那麼它如何做到這一點。瓦爾不能互換的樂趣被重新分配,在樂趣局部變量編譯時錯誤科特林

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

注:這只是一個樣本知道爲什麼我不能夠重新分配局部變量,我們可以用Java做

+4

只是一個側面說明:您'swap'功能不會做任何事情。 – glee8e

+1

函數參數是本地的,並且對它們的賦值(這在Java中是不禁止的)不會改變函數之外的任何東西。此外,您可以將任意表達式傳遞給函數e。 G。交換(9,42)'。這項任務可能看起來很混亂,因此在Kotlin中被禁止。 –

回答

6

在科特林val聲明最後,只讀,參考 - 而這正是編譯器錯誤是告訴你

瓦爾不能重新分配

一旦指定值val,它不能改變。如果你想能夠重新分配它,你必須聲明它爲var

在Kotlin方法參數被隱式聲明爲final,所以你不能像在Java中一樣重新指定它們。

但是你的代碼中的核心錯誤是你試圖交換方法參數。由於方法參數是按值傳遞的,而不是通過引用傳遞的,所以你想在Kotlin中實現的是不可能的(就像Java中不可能的那樣)。即使您將在方法調用中重新分配參數,傳遞給該方法的原始變量也不會改變。

+0

,所以Kotlin劑量支持重新分配要改變的參數值,因爲我已經創建了一個新的var temp = a1 temp = b1 – YLS

+0

你能改正這個答案。 'val'不是一個常量也不是一成不變的,它是一個最終的參考,使用mutable/immutable可以誤導任何引用指向的內容。他的錯誤不是直接關於'val',而是關於Kotlin中總是「最終」的參數。 –

0

不能更改函數參數值,而不是創造交換價值的新變量:

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

這項工作現在如果我嘗試更改/賦值val a1Swapped = b1,然後a1Swapped = 4它顯示相同的錯誤val不能重新分配 – YLS

+0

這個交換什麼都沒有,沒有副作用以外的功能。 –

+0

當然,我只是表明你不能重新分配函數參數 – gildor

4

有兩種誤解位置:

首先,在科特林所有的參數都是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