94 votes

Fonction d'échange dans Kotlin

existe-t-il une meilleure façon d'écrire une fonction d'échange générique dans kotlin autre que la manière java décrite dans Comment écrire une fonction d'échange de base en Java .

Existe-t-il une fonction de langage kotlin qui peut rendre la fonction d'échange générique plus concise et intuitive?

163voto

holi-java Points 15887

Pas besoin du tout d'une fonction de swap dans Kotlin. vous pouvez utiliser la fonction existante également , par exemple:

 var a = 1
var b = 2

a = b.also { b = a }

println(a) // print 2
println(b) // print 1
 

27voto

Ruckus T-Boom Points 1905

Si vous voulez écrire du code vraiment effrayant, vous pourriez avoir une fonction comme celle-ci:

 inline operator fun <T> T.invoke(dummy: () -> Unit): T {
    dummy()
    return this
}
 

Cela vous permettrait d'écrire du code comme celui-ci

 a = b { b = a }
 

Notez que je ne recommande pas cela. Juste montrer que c'est possible.

22voto

gavrie Points 995

Kotlin encourage l'utilisation des données immuables quand c'est possible (comme l'utilisation d' val au lieu de var). Ceci réduit considérablement la changement de bogues subtils, puisqu'il est possible de raisonner plus profondément sur le code si les valeurs ne changent pas.

La permutation de deux valeurs est très bien à l'opposé de données immuables: Ne je veux dire la valeur de a avant ou après l'échange?

Envisagez de réécrire votre code dans la suite de façon immuable:

val a = 1
val b = 2

val (a2, b2) = b to a

Cela fonctionne en faisant usage de la déstructuration des déclarations, ainsi que le haut- to extension de la fonction qui crée un Pair.

19voto

Lior Bar-On Points 169

Edit: Merci à @hotkey pour son commentaire

Je crois que le code pour échanger deux variables est assez simple - pour ne pas essayer de le simplifier davantage.

La forme la plus élégante de mise en œuvre à mon humble avis est:

 var a = 1
var b = 2

run { val temp = a; a = b; b = temp }

println(a) // print 2
println(b) // print 1
 

Avantages:

  • L'intention est forte et claire. personne ne comprendrait cela.
  • temp ne resteront pas dans le périmètre.

12voto

Willi Mentzel Points 7681

C'est une bonne utilisation avec :

 var a = 1
var b = 2

with(a) {
    a = b
    b = this
}

println(a) // 2
println(b) // 1
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X