是否可以在函数参数中使用解构?

时间:2016-03-09 19:43:44

标签: kotlin

Kotlin支持解构声明:

val (a, b) = Pair(1,2)

这类似于Python的可迭代解包:

a, b = (1, 2)

Python还有一个splat / spread运算符,允许您使用函数参数执行类似的操作:

def f(a, b): pass
pair = (1,2)
f(*pair)

kotlin有相似的能力吗?显然,您可以手动解压缩结构:

f(pair.component1(), pair.component2())

但那很笨重。有没有办法更优雅地做到这一点?我在docs on the subject中看不到任何内容。

3 个答案:

答案 0 :(得分:14)

不,这仅适用于数组和vararg函数

val foo = arrayOf(1, 2, 3)
val bar = arrayOf(0, *foo, 4)

答案 1 :(得分:11)

添加@Ivan的答案,以下是相关问题:

1)在函数调用中传播非vararg参数的运算符:

https://youtrack.jetbrains.com/issue/KT-6732

2)lambda参数的解构:

https://youtrack.jetbrains.com/issue/KT-5828

你可以投票给他们。

<强>更新

lambda参数的解构在Kotlin 1.1中实现。

答案 2 :(得分:2)

您可以定义扩展函数来传播Pair的参数。像这样:

fun <A, B, R> Pair<A, B>.spread(f: (A, B) -> R) = f(first, second)

fun add(a: Int, b: Int) = a + b

fun main(args: Array<String>) {
    println(Pair(1, 2).spread(::add))
}

这打印3。