Kotlin:你能为varargs使用命名参数吗?

时间:2016-08-14 09:54:14

标签: function kotlin default-value variadic-functions named-parameters

例如,您可能具有复杂签名和varargs的功能:

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

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

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

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

是否可以为varargs使用命名参数?有没有聪明的解决方法?

4 个答案:

答案 0 :(得分:23)

要将命名参数传递给vararg参数,请使用spread operator

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

答案 1 :(得分:22)

可以通过在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))

答案 2 :(得分:7)

Kotlin Docs明确表示:

  

可变数量的参数(Varargs)

     

函数的参数(通常是最后一个)可以标记为   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)
     

在函数内部,vararg - 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))

希望它会有所帮助

答案 3 :(得分:0)

vararg参数可以在参数列表中的任何位置。请参阅下面的示例,了解如何使用不同的参数集调用它。 BTW任何调用也可以在闭括号后提供lambda。

fun varargs(
  first: Double = 0.0,
  second: String = "2nd",
  vararg varargs: Int,
  third: String = "3rd",
  lambda: ()->Unit = {}
) {
  ...
}

fun main(args: Array<String>) {
  val list = intArrayOf(1, 2, 3)

  varargs(1.0, "...", *list, third="third")
  varargs(1.0, "...", *list)
  varargs(1.0, varargs= *list, third="third")
  varargs(varargs= *list, third="third")
  varargs(varargs= *list, third="third", second="...")
  varargs(varargs= *list, second="...")

  varargs(1.0, "...", 1, 2, 3, third="third")
  varargs(1.0, "...", 1, 2, 3)
  varargs(1.0)

  varargs(1.0, "...", third="third")
  varargs(1.0, third="third")
  varargs(third="third")
}