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))
要将一个命名parameter passing给可变参数,请使用spread运算符 :
complicated(numbers = *intArrayOf(1, 2, 3, 4, 5))
Kotlin Docs明确表示:
可变数量的参数(可变参数)
一个函数的参数(通常是最后一个)可以用
vararg
修饰符来标记:fun
asList(vararg ts: T): List { val result = ArrayList () for (t in ts) // ts is an Array result.add(t) return result } 允许将可变数量的parameter passing给函数:
val list = asList(1, 2, 3)
在函数内部,types
T
的variables参数可以看作是T
一个数组,即上例中的ts
variables的types是Array
。只有一个参数可能被标记为
vararg
参数。 如果vararg
参数不是列表中的最后一个参数,则可以使用命名的参数语法传递以下参数的值,或者如果该参数具有函数types,则可以通过将圆括号之外的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))
希望它会有所帮助