Gibt 'nil' von einer Lua-Funktion in C zurück und gibt 0 Werte zurück

7

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:

%Vor%

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.

    
Niccolo M. 29.08.2013, 23:01
quelle

3 Antworten

12

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.

    
Lorenzo Donati 30.08.2013, 06:04
quelle
5

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).

%Vor%

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).

    
Mario 29.08.2013 23:07
quelle
2

(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.

%Vor%

IMHO muss die Parameterübergabe der Funktion vollständig der Semantik der Zuweisungsanweisung entsprechen.

    
Egor Skriptunoff 31.08.2013 07:12
quelle

Tags und Links