Looking for lua Keywords? Try Ask4Keywords

LuaVariadische Argumente


Einführung

Varargs , wie sie allgemein bekannt sind, erlauben Funktionen, eine beliebige Anzahl von Argumenten ohne Angabe zu übernehmen. Alle Argumente, die einer solchen Funktion übergeben werden, werden in einer einzigen Struktur zusammengefasst, die als Vararg-Liste bezeichnet wird . was geschrieben wird als ... in Lua. Es gibt grundlegende Methoden, um die Anzahl der angegebenen Argumente und den Wert dieser Argumente mithilfe der Funktion select() zu extrahieren. Erweiterte Benutzungsmuster können die Struktur jedoch zu ihrem vollen Nutzen nutzen.

Syntax

  • ... - Macht die Funktion, deren Liste der Argumente eine Variadic-Funktion ist
  • select (what, ...) - Wenn "was" eine Zahl im Bereich 1 der Anzahl der Elemente im vararg ist, wird das Element "what" bis zum letzten Element im vararg zurückgegeben. Die Rückgabe ist null, wenn der Index außerhalb der Grenzen liegt. Wenn 'was' die Zeichenfolge '#' ist, wird die Anzahl der Elemente im vararg zurückgegeben.

Bemerkungen

Effizienz

Die Vararg-Liste wird als verknüpfte Liste in der PUC-Rio-Implementierung der Sprache implementiert. Dies bedeutet, dass die Indizes O (n) sind. Das bedeutet, dass das Durchlaufen der Elemente in einem vararg mithilfe von select() , wie im Beispiel unten, eine O (n ^ 2) -Operation ist.

for i = 1, select('#', ...) do
    print(select(i, ...))
end

Wenn Sie die Elemente in einer Vararg-Liste durchlaufen möchten, packen Sie die Liste zunächst in eine Tabelle. Tabellenzugriffe sind O (1), so dass insgesamt 0 (n) iteriert wird. Wenn Sie dazu neigen, foldr() Sie sich das Beispiel foldr() aus dem Abschnitt Advanced foldr() . Es verwendet Rekursion, um eine Vararg-Liste in O (n) zu durchlaufen.

Sequenzlänge Definition

Der vararg ist insofern nützlich, als die Länge des vararg alle explizit übergebenen (oder berechneten) Nils berücksichtigt. Zum Beispiel.

function test(...)
    return select('#', ...)
end

test()             --> 0
test(nil, 1, nil)  --> 3

Dieses Verhalten steht jedoch im Konflikt mit dem Verhalten von Tabellen, bei denen der Längenoperator # nicht mit 'Löchern' (eingebetteten Nils) in Sequenzen arbeitet. Die Berechnung der Länge einer Tabelle mit Löchern ist undefiniert und kann nicht verlässlich sein. Abhängig von den Werten in ... führt die Länge von {...} möglicherweise nicht zur "richtigen" Antwort. In Lua 5.2+ wurde table.pack() zur table.pack() dieses Mangels eingeführt (im Beispiel gibt es eine Funktion, die diese Funktion in reiner Lua implementiert).

Idiomatische Verwendung

Da Varargs ihre Länge mitreißen, verwenden sie sie als Sequenzen, um das Problem mit Löchern in Tabellen zu vermeiden. Dies war nicht ihre beabsichtigte Verwendung und eine, für die die Referenzimplementierung von Lua nicht optimiert wird. Obwohl eine solche Verwendung in den Beispielen untersucht wird, wird sie im Allgemeinen missbilligt.

Variadische Argumente Verwandte Beispiele