Wenn Sie benannte Argumente und Standardwerte wie PHP oder Python möchten, können Sie Ihre Funktion mit einem Tabellenkonstruktor aufrufen:
myfunction{a,b=3,c=2}
(Dies ist an vielen Stellen in Lua zu beobachten, beispielsweise in den fortgeschrittenen Formen der Protokollmodule und Konstruktoren von LuaSocket in IUPLua .)
Die Funktion selbst könnte eine folgende Signatur haben:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
-- function continues down here...
end
Alle in der Parametertabelle fehlenden Werte werden aus der __index
Tabelle in ihrer Metatabelle übernommen (siehe Dokumentation zu Metatabellen ).
Natürlich sind erweiterte Tabellenstile mithilfe von Tabellenkonstruktoren und -funktionen möglich. Sie können alles schreiben, was Sie benötigen. Zum Beispiel, hier ist eine Funktion , die eine Funktion konstruiert , die Namen-oder-Positions Argument Tabellen aus einer Tabelle eine reguläres Argument unter Liste definieren , die Parameternamen und Standardwerte und eine Funktion übernimmt.
Als Funktion auf Nicht-Sprachebene können solche Aufrufe geändert werden, um neue Verhaltensweisen und Semantiken bereitzustellen:
- Variablen können so eingestellt werden, dass sie mehr als einen Namen akzeptieren
- Positionsvariablen und Schlüsselwortvariablen können eingestreut werden - und die Definition beider Variablen kann entweder Vorrang haben (oder einen Fehler verursachen).
- Positionslose Variablen nur mit Schlüsselwörtern sowie namenlose Positionsvariablen können erstellt werden
- Die ziemlich ausführliche Tabellenkonstruktion könnte durch Parsen einer Zeichenfolge erfolgen
- Die Argumentliste kann wörtlich verwendet werden, wenn die Funktion mit einer anderen Tabelle als 1 aufgerufen wird
Einige nützliche Funktionen zum Schreiben von Argumentübersetzern sind unpack
(Verschieben table.unpack
in 5.2), setfenv
(in 5.2 mit der neuen _ENV
Konstruktion veraltet ) und select
(die einen einzelnen Wert aus einer bestimmten Argumentliste oder die Länge der Liste mit zurückgeben '#'
).