Подтвердить что ты не робот

Функция обмена в Котлине

есть ли лучший способ написать общую функцию подкачки в kotlin, отличную от java, описанную в Как написать базовую функцию свопинга в Java.

Есть ли какая-либо функция языка kotlin, которая может сделать общую функцию свопинга более кратким и интуитивным?

4b9b3361

Ответ 1

В Котлине нет никакой функции свопинга. вы можете использовать существующую функцию also, например:

var a = 1
var b = 2

a = b.also { b = a }

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

Ответ 2

Если вы хотите написать действительно страшный код, у вас может быть такая функция:

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

Это позволит вам написать такой код

a = b { b = a }

Обратите внимание, что я рекомендую НЕ. Просто покажите это.

Ответ 3

Изменить: благодаря @hotkey для комментария

Я считаю, что код для замены двух переменных достаточно прост - не пытаться упростить его.

Самая элегантная форма реализации IMHO:

var a = 1
var b = 2

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

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

Преимущества:

  • Цель - громкая и ясная. никто не поймет это неправильно.
  • temp не останется в области.

Ответ 4

Kotlin поощряет использование неизменяемых данных, когда это возможно (например, используя val вместо var). Это значительно уменьшает изменения для тонких ошибок, поскольку можно более разумно рассуждать о коде, если значения не изменяются.

Переключение двух значений очень сильно противоположно неизменяемым данным: я имел в виду значение a до или после обмена?

Рассмотрите возможность перезаписи кода следующим образом:

val a = 1
val b = 2

val (a2, b2) = b to a

Это работает, используя объявления о деструкции вместе со встроенной функцией расширения to, которая создает Pair.

Ответ 5

Это хорошее использование для with:

var a = 1
var b = 2

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

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

Ответ 6

Чтобы использовать Kotlin List вы можете создать этот вид расширения. Он возвращает копию этого списка с элементами под индексами a и b, поменяными местами.

fun <T> List<T>.swap(a: Int, b: Int): List<T> = this
    .toMutableList()
    .also {
        it[a] = this[b]
        it[b] = this[a]
    }