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 '#'
).
x or default
Ausdruck, der auch in dieser Antwort verwendet wird, nicht wirklich den Standardwerten der Parameter entspricht, sondern nur eine vereinfachte Problemumgehung, die nur funktioniert, wenn beidenil
undfalse
ungültige Parameterwerte sind. Angenommen, der Standardwert für einen booleschen Parameterx
isttrue
und der Aufrufer übergibt einen expliziten Wertfalse
. Dannx or true
gibttrue
, obwohlfalse
explizit übergeben wurde. Eine bessere Version wäreif x == nil then x = default end
, die auch besser lesbar ist; Es kann jedoch immer noch keine explizitennil
Argumente verarbeiten.Meiner Meinung nach gibt es keinen anderen Weg. Das ist nur die Lua-Mentalität: kein Schnickschnack und bis auf etwas syntaktischen Zucker keine überflüssigen Methoden, um einfache Dinge zu tun.
quelle
Technisch gesehen gibt es
b = b == nil and 7 or b
(was verwendet werden sollte, wennfalse
ein gültiger Wertfalse or 7
mit 7 bewertet wird), aber das ist wahrscheinlich nicht das, wonach Sie suchen.quelle
false
, ist es einfacher, die Variable zuerst und die Standardeinstellung zuletzt zu setzen.b = b or 7
b = b or 7
).Der einzige Weg, den ich bisher gefunden habe, der Sinn macht, ist, so etwas zu tun:
quelle