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
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.
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
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
}