Ответ 1
В Котлине нет никакой функции свопинга. вы можете использовать существующую функцию also, например:
var a = 1
var b = 2
a = b.also { b = a }
println(a) // print 2
println(b) // print 1
есть ли лучший способ написать общую функцию подкачки в kotlin, отличную от java, описанную в Как написать базовую функцию свопинга в Java.
Есть ли какая-либо функция языка kotlin, которая может сделать общую функцию свопинга более кратким и интуитивным?
В Котлине нет никакой функции свопинга. вы можете использовать существующую функцию also, например:
var a = 1
var b = 2
a = b.also { b = a }
println(a) // print 2
println(b) // print 1
Если вы хотите написать действительно страшный код, у вас может быть такая функция:
inline operator fun <T> T.invoke(dummy: () -> Unit): T {
dummy()
return this
}
Это позволит вам написать такой код
a = b { b = a }
Обратите внимание, что я рекомендую НЕ. Просто покажите это.
Изменить: благодаря @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
не останется в области.Kotlin поощряет использование неизменяемых данных, когда это возможно (например, используя val
вместо var
). Это значительно уменьшает изменения для тонких ошибок, поскольку можно более разумно рассуждать о коде, если значения не изменяются.
Переключение двух значений очень сильно противоположно неизменяемым данным: я имел в виду значение a
до или после обмена?
Рассмотрите возможность перезаписи кода следующим образом:
val a = 1
val b = 2
val (a2, b2) = b to a
Это работает, используя объявления о деструкции вместе со встроенной функцией расширения to
, которая создает Pair
.
Это хорошее использование для with:
var a = 1
var b = 2
with(a) {
a = b
b = this
}
println(a) // 2
println(b) // 1
Чтобы использовать 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]
}