В Котлине есть возможность определить функцию так, чтобы она могла принимать переменное количество аргументов с одним и тем же типом данных. Это называется Переменные параметры. Это полезно, когда вы точно не знаете, сколько аргументов будет передано функции. Параметр Vararg используется в объявлении функции с ключевым словом варарг охарактеризован.
Пример: предположим, что мы хотим передать в функцию ряд чисел типа данных Int, не зная точно, сколько чисел там будет. Чтобы представить этот случай, нам может помочь следующая функция с переменным числом аргументов:
fun main() {
printAllNumbers(1, 2, 3, 4, 5)
println()
printAllNumbers(10, 15, 20, 25, 30, 35, 40, 45, 50)
}
fun printAllNumbers(vararg numbers: Int) { // Deklaration der Funktion mit variabler Anzahl an Argumenten
for (number in numbers) { // Innerhalb der Funktion können wir dann auf die übergebenen Zahlen mithilfe einer for-Schleife wie auf ein Array zugreifen
print("$number ")
}
}
Другой пример: мы хотим иметь функцию, которая вычисляет сумму всех переданных ей чисел:
fun main() {
val result1 = sumOfAllNumbers(1, 2, 3, 4, 5)
println(result1)
val result2 = sumOfAllNumbers(10, 15, 20, 25, 30)
println(result2)
}
fun sumOfAllNumbers(vararg numbers: Int): Int {
var sum: Int = 0
for (number in numbers) {
sum = sum + number
}
return sum
}
Параметры Vararg также можно комбинировать с именованными аргументами. Например, функция может иметь несколько именованных аргументов и параметр vararg. В таких случаях параметр vararg обычно помещается последним в списке параметров.
fun main() {
printWithText("Number", 1, 2, 3, 4, 5)
}
fun printWithText(text: String, vararg numbers: Int) {
for (number in numbers) {
println("$text: $number")
}
}
Однако это не обязательно: если после параметра vararg есть другие параметры, значения этих параметров передаются через именованные аргументы при вызове функции:
fun main() {
printWithText("Begin of sequence", "Number", 1, 2, 3, 4, 5, text3="End of sequence") // Nach vararg-Parameter wird der Wert 'End of sequence' über das benannte Argument 'text3' übergeben
}
fun printWithText(text1: String, text2: String, vararg numbers: Int, text3: String) {
println(text1)
for (number in numbers) {
println("$text2: $number")
}
println(text3)
}
Оператор распространения (*)
Обычно массив передается функции как один аргумент. В примерах, показанных выше, это приведет к ошибке компиляции. Оператор распространения (*) помогает нам передавать каждый элемент массива как отдельный аргумент функции.
fun main() {
val nums = intArrayOf(1, 2, 3, 4)
numberPlusNumber(*nums, plusNumber = 1) // Mithilfe des Operators '*' werden Elemente aus dem Array 'nums' einzeln an die Funktion 'numberPlusNumber' übergeben
}
fun numberPlusNumber(vararg sequenceOfNumbers: Int, plusNumber: Int) {
for(number in sequenceOfNumbers)
println(number + plusNumber)
}