Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function Kotlin:您能为varargs使用命名参数吗?_Function_Kotlin_Default Value_Variadic Functions_Named Parameters - Fatal编程技术网

Function Kotlin:您能为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

例如,您可能有一个具有复杂签名和varargs的函数:

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
}
在函数内部a
vararg
-类型为
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")
}