Einige Lua-Funktionen geben nil
zurück, um dem Benutzer zu signalisieren, dass die Funktion einige Aufgaben nicht ausführen konnte (z. B. tonumber()
, string.find()
).
In C wird return nil
folgendermaßen ausgeführt:
Wie auch immer, ich frage mich, ob es in Ordnung ist, stattdessen folgendes zu tun:
%Vor% Es ist kürzer. Ich habe es versucht und es scheint zu funktionieren, aber ich weiß nicht, ob das By-Design ist. Ich habe Luas Quellcode untersucht und sehe dieses return 0
-Muster nicht, also frage ich mich, ob es richtig ist, das zu tun.
Gibt es zwei verschiedene Möglichkeiten, nil
äquivalent zurückzugeben?
(Übrigens, ich weiß alles über Signalisierungsfehler über Ausnahmen (also lua_error()
) also bitte nicht erwähnen.)
UPDATE:
Ich sehe jetzt, dass es einen feinen Unterschied zwischen den beiden Methoden gibt: print((function() end)())
würde nichts drucken, während print((function() return nil end)())
"nil" drucken würde. Ich weiß nicht, wie wichtig das ist.
Funktionen in Lua können nil
zurückgeben, können aber auch nichts zurückgeben, und dieses Verhalten ist nicht exakt gleichwertig, obwohl es in den meisten Fällen zu den gleichen Ergebnissen führt.
Das folgende Lua-Skript zeigt Ihnen, wie Sie feststellen können, wie viele Rückgabewerte eine Funktion zurückgibt:
%Vor% Ich sagte, das Verhalten ist fast gleichwertig, denn sobald Sie versuchen, einer Variablen das Ergebnis einer Funktion zuzuordnen, erhält diese Variable nil
in beiden Fällen, so dass der nachfolgende Code den Unterschied nicht erkennen kann . Aber, wie ich oben gezeigt habe, können Sie den Unterschied erkennen, wenn Sie wirklich brauchen.
Ja, das ist vollkommen richtig. Wenn Sie versuchen, mehr Rückgabewerte anzufordern / zuzuweisen als vorhanden (egal, ob Sie versuchen, eins oder zehn zu erhalten), erhalten Sie nil
für die undefinierten (d. H. Die nicht zurückgegebenen).
Sie können es wahrscheinlich nicht in Luas Quelle finden, weil es kein spezieller Fall oder irgendetwas ist. Es ist nur Lua's generische Art, mit Rückgabewerten umzugehen.
Aktualisierung:
Der Unterschied, den Sie beim Drucken von Rückgabewerten bemerkt haben, ist die Tatsache, dass es sich nicht nur um eine Zuweisung handelt. Natürlich gibt es einen kleinen Unterschied zwischen der Rückgabe von nil
und der Rückgabe von gar nichts - und es ist möglich, dort zu unterscheiden. Am Ende müssen Sie nur sicherstellen, dass Sie das Verhalten Ihrer Funktion korrekt dokumentieren, d. H. Dem Benutzer sagen, was passieren soll. Beispielsweise könnte die Rückgabe von nil
(oder das Abrufen von nil
in einer Zuweisung) einen Fehlerzustand darstellen. Es ist jedoch auch möglich, im Falle eines Fehlers nichts zurückzugeben und nil
zurückzugeben, wenn ein Wert ungültig sein sollte oder nil
(aber kein Fehler ist aufgetreten).
(Dies ist keine Antwort, nur eine Meinung über das Thema)
Für mich ist dieser künstliche Unterschied zwischen nil
und no value
inkonsistent und eher ärgerlich.
IMHO muss die Parameterübergabe der Funktion vollständig der Semantik der Zuweisungsanweisung entsprechen.