例如,您可能具有复杂签名和varargs的功能:
fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int)
你应该能够像这样调用这个函数是有道理的:
complicated(numbers = 1, 2, 3, 4, 5)
不幸的是,编译器不允许这样做。
是否可以为varargs使用命名参数?有没有聪明的解决方法?
答案 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")
}