ProgrammierungKotlin-Entwickler

Wie funktioniert 'vararg' in Kotlin? Beschreiben Sie die Übertragungsregeln, Einschränkungen, die Interaktion mit gängigen Mustern und typische Schwierigkeiten bei der Kombination mit benannten und regulären Argumenten.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Üblicher Syntax: fun foo(vararg numbers: Int)
  • Ein Argument mit vararg muss das letzte unter den Parametern der Funktion sein (wenn danach noch Parameter sind, müssen sie beim Aufruf benannt werden).
  • Man kann sowohl einzelne Werte als auch ein Array (mit dem Spread-Operator *) übergeben.
  • Eine Funktion mit vararg kann aufgerufen werden, ohne Werte für dieses Argument zu übergeben.

Codebeispiel

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)

Trickfrage.

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 = "->")

Beispiele für tatsächliche Fehler aufgrund des Unwissens über die Feinheiten des Themas.


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.