是否有更好的方法在kotlin中编写通用交换函数,而不是How to write a basic swap function in Java中描述的java方式 .
是否有任何kotlin语言功能可以使通用交换功能更简洁直观?
编辑:感谢@hotkey的评论
我相信交换两个变量的代码很简单 - 不要再尝试简化它了 .
最优雅的实施形式恕我直言:
var a = 1 var b = 2 run { val temp = a; a = b; b = temp } println(a) // print 2 println(b) // print 1
优点:
意图大声而清晰 . 没有人会误解这一点 .
temp 不会留在范围内 .
temp
根本不需要在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 }
请注意,我做 NOT 推荐这个 . 只是表明它是可能的 .
Kotlin鼓励尽可能使用不可变数据(例如使用 val 而不是 var ) . 这大大减少了细微错误的变化,因为它会发生变化 .
val
var
交换两个值与不可变数据完全相反:我是指交换之前或之后 a 的值吗?
a
考虑以下面的不可变方式重写代码:
val a = 1 val b = 2 val (a2, b2) = b to a
这通过使用destructuring declarations以及创建 Pair 的内置 to 扩展函数来工作 .
Pair
to
这是with的一个很好的用法:
var a = 1 var b = 2 with(a) { a = b b = this } println(a) // 2 println(b) // 1
5 回答
编辑:感谢@hotkey的评论
我相信交换两个变量的代码很简单 - 不要再尝试简化它了 .
最优雅的实施形式恕我直言:
优点:
意图大声而清晰 . 没有人会误解这一点 .
temp
不会留在范围内 .根本不需要在Kotlin中使用交换功能 . 您可以使用现有的also函数,例如:
如果你想写一些非常可怕的代码,你可以有这样的函数:
这将允许您编写这样的代码
请注意,我做 NOT 推荐这个 . 只是表明它是可能的 .
Kotlin鼓励尽可能使用不可变数据(例如使用
val
而不是var
) . 这大大减少了细微错误的变化,因为它会发生变化 .交换两个值与不可变数据完全相反:我是指交换之前或之后
a
的值吗?考虑以下面的不可变方式重写代码:
这通过使用destructuring declarations以及创建
Pair
的内置to
扩展函数来工作 .这是with的一个很好的用法: