📜  将变量参数传递给 Kotlin 中的函数

📅  最后修改于: 2022-05-13 01:55:34.619000             🧑  作者: Mango

将变量参数传递给 Kotlin 中的函数

在很多场景中,我们需要将可变参数传递给函数。在 Kotlin 中,您可以通过使用 vararg 参数声明函数来将可变数量的参数传递给函数。 T 类型的可变参数在内部表示为函数体内的 T 类型 ( Array ) 数组。在本文中,我们将介绍所有方法。我们将通过几个示例来演示如何使用 Kotlin 的这一特性。

例子

让我们完成以下步骤,我们将演示如何将可变数量的参数传递给函数。使用 vararg,我们可以将逗号分隔的参数传递给函数,其中我们将方法的单个参数定义为 vararg,如下例所示:

Kotlin
fun main (args: Array) {
  someMethod ( "as", "you", "know", "this", "works")
}
  
fun someMethod (vararg a: String) {
  for (a_ in a) {
    println(a_)
  }
}


Kotlin
fun main(args: Array) {
   val list = arrayOf ("as", "you", "know", "this", "works")
   someMethod (*list)
}
  
fun someMethod (vararg a: String) {
  for (a_in a) {
    println(a_)
  }
}


Kotlin
fun main (args: Array) {
  val list = arrayof( "as", "you", "know", "this", "works")
  someMethod ( 3, *list)
}
  
fun someMethod (b: Int, vararg a: String) {
  for (a_ in a) {
    println(a_)
  }
}


Kotlin
fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works")
}
  
fun someMethod (b: String, vararg a: String) {
  printIn ("b: " + b)
  for (a_ in a) {
       println (a_)
  }
}


Kotlin
fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works", "what")
}
  
fun someMethod (b: String, vararg a: String, c: String) {
  printin ("b: " + b)
  for (a_ in a) {
    println(a_)
  }
  println("c: " + c)
}


Kotlin
fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works", c = "what")
}
  
fun someMethod (b: String, vararg a: String, c: String) {
  printin ("b: " + b)
  for (a_ in a){
    println(a_)
  }
  println ("c: " + c)
}


Kotlin
fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works")
}
  
fun someMethod (b: String = "x", vararg a: String) {
  printin ("b: " + b)
  for (a_ in a){
    println (a_)
  }
}


Kotlin
fun main (args: Array) {
  someMethod (a = *arrayOf ("3", "as", "you", "know", "this", "works"))
}
  
fun someMethod (b: String = "x", vararg a: String) {
  printin ("b: " + b)
  for (a in a){
    println (a_)
  }
}


此外,如果您已经有一个值数组,则可以使用 * 扩展运算符直接传递它:

科特林

fun main(args: Array) {
   val list = arrayOf ("as", "you", "know", "this", "works")
   someMethod (*list)
}
  
fun someMethod (vararg a: String) {
  for (a_in a) {
    println(a_)
  }
}

所以基本上, vararg 告诉编译器接受传递的参数并将它们包装到一个数组中。另一方面,扩展运算符只是告诉编译器解包数组成员并将它们作为单独的参数传递,扩展运算符 - 即 * - 放在传入的数组名称之前。但是,显然,可能总是需要传递其他参数、命名参数等。在下面的示例代码中,我们尝试传递除 vararg 之外的另一个参数:

科特林

fun main (args: Array) {
  val list = arrayof( "as", "you", "know", "this", "works")
  someMethod ( 3, *list)
}
  
fun someMethod (b: Int, vararg a: String) {
  for (a_ in a) {
    println(a_)
  }
}

在下一个示例中,第一个参数类似于 vararg 类型,但它有效:

科特林

fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works")
}
  
fun someMethod (b: String, vararg a: String) {
  printIn ("b: " + b)
  for (a_ in a) {
       println (a_)
  }
}

输出:

b: 3
as
you
know
this
works

所以通常,vararg 是最后一个传递的参数,但是如果我们想在 vararg 之后传递其他参数怎么办?我们可以,但他们必须被命名。这就是为什么以下代码无法编译的原因:

科特林

fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works", "what")
}
  
fun someMethod (b: String, vararg a: String, c: String) {
  printin ("b: " + b)
  for (a_ in a) {
    println(a_)
  }
  println("c: " + c)
}

它无法编译,因为传入的最后一个字符串被认为是 vararg 的一部分,并且编译器会抛出错误,因为我们没有传递 c 的值。要正确执行此操作,我们需要将 c 作为命名参数传递,如下所示:

科特林

fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works", c = "what")
}
  
fun someMethod (b: String, vararg a: String, c: String) {
  printin ("b: " + b)
  for (a_ in a){
    println(a_)
  }
  println ("c: " + c)
}

输出:

b: 3
as
you
know
this
works
c:  what

vararg 修饰符告诉编译器采用所有逗号分隔的参数并将它们包装到一个数组中,而 *- 即扩展运算符 - 解包数组的元素并将它们作为参数传递。

如果我们希望第一个参数具有默认值怎么办,如下例所示:

科特林

fun main (args: Array) {
  someMethod ("3", "as", "you", "know", "this", "works")
}
  
fun someMethod (b: String = "x", vararg a: String) {
  printin ("b: " + b)
  for (a_ in a){
    println (a_)
  }
}

我们希望所有参数都被视为 vararg 的一部分,但编译器将第一个参数读取为 b。在这种情况下,命名传递的参数可以解决问题:

科特林

fun main (args: Array) {
  someMethod (a = *arrayOf ("3", "as", "you", "know", "this", "works"))
}
  
fun someMethod (b: String = "x", vararg a: String) {
  printin ("b: " + b)
  for (a in a){
    println (a_)
  }
}

在前面的代码中,编译器理解为没有传递 b 的值,它采用了默认值。同样,如果你想在你的函数中有两个可变参数,你需要传递命名参数。