Function Kotlin:您能为varargs使用命名参数吗?
例如,您可能有一个具有复杂签名和varargs的函数:Function Kotlin:您能为varargs使用命名参数吗?,function,kotlin,default-value,variadic-functions,named-parameters,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使用命名参数吗?有什么巧妙的解决方法吗?可以通过在vararg之后移动可选参数来解决: fun complicated(varar
fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int)
可以这样调用此函数:
complicated(numbers = 1, 2, 3, 4, 5)
不幸的是,编译器不允许这样做
可以为varargs使用命名参数吗?有什么巧妙的解决方法吗?可以通过在
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
sugar用于显式数组参数:
fun complicated(easy: Boolean = false, hard: Boolean = true, numbers: IntArray) = {}
complicated(numbers = intArrayOf(1, 2, 3, 4, 5))
要将命名参数传递给vararg参数,请使用:
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
}
在函数内部avararg
-类型为T
的参数作为
T
的数组,即上例中的ts
变量具有类型
数组
只有一个参数可以标记为vararg
。如果是vararg
参数
不是列表中的最后一个,以下参数的值
可以使用命名参数语法传递,或者,如果参数
通过在括号外传递lambda,具有函数类型
调用vararg
-函数时,可以逐个传递参数,
e、 g.asList(1,2,3)
,或者,如果我们已经有了一个数组并且想要
将其内容传递给函数,我们使用扩展操作符
(在数组前面加上*
):
发件人:
要继续,您可以使用spread运算符使其看起来像:
complicated(numbers = *intArrayOf(1, 2, 3, 4, 5))
希望对您有所帮助。vararg参数可以位于参数列表中的任何位置。请参阅下面的示例,了解如何使用不同的参数集调用它。顺便说一句,任何调用都可以在闭括号后提供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")
}
fun varargs(
第一:双=0.0,
第二个:String=“第二个”,
vararg varargs:Int,
第三:String=“第三”,
lambda:()->Unit={}
) {
...
}
趣味主线(args:Array){
val list=intArrayOf(1,2,3)
varargs(1.0,“…”,*list,third=“third”)
varargs(1.0,“…”,*列表)
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”)
}
更改签名对函数用户不好。按照传统,vararg是最后一个,当您想像您指出的那样正常调用它时,它可能会导致问题<代码>数字=*intArrayOf(…)是这里的方法。
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
complicated(numbers = *intArrayOf(1, 2, 3, 4, 5))
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")
}