Das Schlüsselwort vararg in Kotlin ermöglicht es einer Funktion, eine variable Anzahl von Argumenten zu akzeptieren. Dies ist das Äquivalent zu Arrays in Java, jedoch mit zusätzlichem syntaktischen Zucker.
Regeln und Einschränkungen:
fun foo(vararg numbers: Int)vararg muss das letzte unter den Parametern der Funktion sein (wenn danach noch Parameter sind, müssen sie beim Aufruf benannt werden).*) übergeben.vararg kann aufgerufen werden, ohne Werte für dieses Argument zu übergeben.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // wird funktionieren printAll(*arr) // spread (entpackt das Array)
Kann man zwei 'vararg'-Parameter in einer Funktion deklarieren oder 'vararg' nicht zuletzt platzieren?
Antwort: Nein, in Kotlin kann man nur einen vararg in der Funktionsdeklaration verwenden, er muss immer zuletzt bei den Positionsargumenten stehen. Wenn man danach einen regulären Parameter hinzufügt, kann dieser nur benannt übergeben werden.
Beispiel:
fun foo(vararg items: String, prefix: String) // Kompilierungsfehler! // Richtig: fun foo(vararg items: String, vararg items2: Int) // Kompilierungsfehler! // Funktioniert: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Geschichte
Ein junger Programmierer war fälschlicherweise der Meinung, dass man zwei vararg-Parameter gleichzeitig deklarieren könne. Die Architektur der Funktion baute sich so auf, dass die Trennung auf mehreren Ebenen des Aufrufs stand. Dies führte zu einer Reihe von Refaktorisierungen — die Logik der akzeptierten Daten musste überdacht und alle Aufrufe neu geschrieben werden.
Geschichte
Im Android-Projekt wurde vergessen, den Spread-Operator * beim Übergeben eines Arrays an eine Funktion mit dem Parameter vararg zu verwenden: printAll(arr) anstelle von printAll(*arr). In der Folge wurde anstelle des Drucks der Elemente das Array als eine Zeichenkette mit der Objektadresse ausgegeben, was dazu führte, dass sich die Anwendung seltsam verhielt.
Geschichte
In einer Funktion mit vararg und zusätzlichen benannten Parametern fun foo(vararg a: Int, b: Int) wurden die Aufrufe über Positionsargumente falsch interpretiert: Der Compiler konnte nicht feststellen, wo die Liste für vararg endet und wo das Argument b beginnt, was zu Kompilierungsfehlern führte. Man entschloss sich, für solche Parameter explizit die Argumentnamen zu verwenden.