web-dev-qa-db-fra.com

Val ne peut pas être réaffecté erreur de temps de compilation pour la variable locale en jeu dans kotlin

Ici, lors d’un échange amusant, j’essaie de modifier la valeur de a1 avec b1, mais elle montre que val ne peut pas être réaffecté lors d’une erreur de compilation. si je ne peux pas changer comme ça, alors comment est-il possible de le faire.

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

Note: ceci est juste un exemple pour savoir pourquoi je ne suis pas capable de réaffecter la variable locale comme on peut le faire en Java

11
YLS

Dans Kotlin, val déclare final, lecture seule, référence - et c’est exactement ce que vous dit une erreur du compilateur avec

Val ne peut pas être réaffecté

Une fois que vous affectez une valeur à val, elle ne peut plus être modifiée. Si vous voulez pouvoir le réaffecter, vous devez le déclarer comme var

Dans la méthode Kotlin, les paramètres sont implicitement déclarés en tant que final val, vous ne pouvez donc pas les réaffecter comme vous le pouvez en Java.

Mais l’erreur principale dans votre code est que vous essayez d’échanger les paramètres de méthode. Étant donné que les paramètres de méthode sont passés par valeur et non par référence, ce que vous voulez réaliser est impossible dans Kotlin (tout aussi bien qu'en Java). Même si vous réaffectiez des paramètres dans l'appel de méthode, les variables d'origine transmises à la méthode ne seraient pas modifiées.

19
Dalija Prasnikar

Il y a deux malentendus ici:

Premièrement, dans Kotlin, tous les paramètres sont final et cela ne peut pas être modifié. Tout comme en Java, une référence final ne peut pas être modifiée. Vous obtenez donc une erreur lorsque vous essayez de réaffecter une référence final ou val

Deuxièmement, puisque vous avez une copie d'une référence à une chaîne, votre fonction d'échange n'aura aucun effet sur les références d'origine de l'appelant. Votre fonction d'échange ne fonctionnerait pas non plus en Java. 

Par exemple, appeler votre code ne fait rien:

val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2)   // Java or Kotlin, doesn't matter
println(s1)
println(s2)

// output:
// howdy
// goodbye

Et l'appeler avec des expressions littérales ou des expressions ne fait rien:

swap("happy","day")  // what references is it supposed to be swapping?

Vous ne pouvez échanger que le contenu d'un objet pour lequel vous avez la même référence que l'appelant. Pour effectuer une routine d'échange, vous feriez quelque chose comme:

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
}

Ce que vous pourriez appeler:

val stringies = MutablePair("howdy", "goodbye")
println("${stringies.one} ${stringies.two}")
swap(MutablePair()
println("${stringies.one} ${stringies.two}")

// output:
// howdy goodbye
// goodbye howdy
4
Jayson Minard

Vous ne pouvez pas modifier la valeur du paramètre de fonction, créez plutôt de nouvelles variables pour les valeurs échangées:

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