Kotlin:你可以用varargs命名参数吗?

例如,你可能有一个复杂的签名和可变参数的函数:

fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int) 

这应该是有道理的,你应该能够这样调用这个函数:

 complicated(numbers = 1, 2, 3, 4, 5) 

不幸的是,编译器不允许这样做。

有没有可能使用可变参数命名参数? 有没有什么聪明的解决办法?

可以通过在vararg参数后面移动可选参数来解决这个问题:

 fun complicated(vararg numbers: Int, easy: Boolean = false, hard: Boolean = true) = {} 

那么它可以这样调用:

 complicated(1, 2, 3, 4, 5) complicated(1, 2, 3, hard = true) complicated(1, easy = true) 

请注意,尾随可选参数需要始终以名称传递。 这不会编译:

 complicated(1, 2, 3, 4, true, true) // compile error 

另一个选择是为显式数组参数vararg糖:

 fun complicated(easy: Boolean = false, hard: Boolean = true, numbers: IntArray) = {} complicated(numbers = intArrayOf(1, 2, 3, 4, 5)) 

要将一个命名参数传递给可变参数,请使用spread运算符 :

 complicated(numbers = *intArrayOf(1, 2, 3, 4, 5)) 

Kotlin Docs明确表示:

可变数量的参数(可变参数)

函数的参数(通常是最后一个)可以用vararg修饰符标记:

 fun <T> asList(vararg ts: T): List<T> { val result = ArrayList<T>() for (t in ts) // ts is an Array result.add(t) return result } 

允许将可变数量的参数传递给该函数:

  val list = asList(1, 2, 3) 

在函数内部,类型T的变量参数可以看作是T一个数组,即上例中的ts变量的类型是Array<out T>

只有一个参数可能被标记为vararg参数。 如果vararg参数不是列表中的最后一个参数,则可以使用命名的参数语法传递以下参数的值,或者如果该参数具有函数类型,则可以通过将圆括号之外的lambda传递给参数。

当我们调用vararg参数函数时,我们可以逐个传递参数,例如, asList(1, 2, 3) ,或者如果我们已经有一个数组并且想把它的内容传递给函数,我们使用spread操作符(以*前缀):

 val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4) 

来自: https : //kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs

要恢复,你可以使用扩展运算符使它看起来像这样:

 complicated(numbers = *intArrayOf(1, 2, 3, 4, 5)) 

希望它会有所帮助