2017-12-29 18 views
1

Mein Code (psuedo)Wie ein Funktionswert von pcall zurückzukehren() in lua

function foo(cmd) 
    return load(cmd) --Note that this could cause an error, should 'cmd' be an invalid command 
end 

function moo() 
    return "moo" 
end 

function yoo(something) 
    something.do() 
end 

cmd = io.read() --Note that a syntax error will call an error in load. Therefore, I use pcall() 
local result, error = pcall(cmd) 
print(result) 

Dieser Code in Ordnung, und Werke sieht, aber mein Problem ist, wenn ich in moo() geben zeigen result wird dann nur, ob oder nicht der Befehl wurde ohne einen Fehler ausgeführt (Wenn der Befehl einen Fehler aufruft, hat error seinen Wert).

Auf einer anderen Anmerkung, wenn ich yoo() anrufen will, ich werde nicht einen Rückgabewert von ihm erhalten, so will ich pcall() ‚s true/false (oder irgendein alternatives Mittel außer pcall())

Gibt es eine alternative Möglichkeit, moo() aufzurufen, erhalten einen Rückgabewert und auch in der Lage, irgendwelche Fehler zu fangen?

HINWEIS: Ich konnte keine try catch äquivalenten anderen als pcall/xpcall finden.

+0

Der globale Namespace Sie können hier helfen ... Wie wäre es: lokalen Status, Ergebnis = pcall (_G [cmd])? Das "Ergebnis" kann entweder das Funktionsergebnis oder ein Fehler sein, den die Funktion mit dem Funktionsfehler ({alles = 123}) auslöst. –

+0

Um einen zurückgegebenen Wert zu erhalten, sollten Sie 'return moo()' anstelle von 'moo()' –

+0

@EgorSriptunoff eingeben Wie gesagt, dies ist Pseudo-Code. Das größte Problem (das ich dem Edit der Antwort hinzufüge) ist, dass ich einen Rückgabewert haben möchte oder nicht. Es wird eine Vielzahl von Funktionen aufgerufen, von denen einige keinen Rückgabewert haben. – GreenHawk1220

Antwort

0

ein bisschen veraltet, aber immer noch ohne richtige Antwort ...

Was Sie suchen ist eine Kombination aus load() und pcall()

  1. Verwenden load() die eingegebene Zeichenkette cmd in etwas zu kompilieren, kann ausgeführt werden (Funktion).
  2. Verwenden pcall() die Funktion zurück auszuführen, indem load()
  3. Beide Funktionen Fehlermeldungen zurückgeben kann. Erhalten Sie Syntaxfehler Beschreibung von load() und Laufzeitfehler Beschreibung von pcall()

    function moo() 
        return "moo" 
    end 
    
    function yoo(something) 
        something.do_something() 
    end 
    
    cmd = io.read() 
    
    -- we got some command in the form of a string 
    -- to be able to execute it, we have to compile (load) it first 
    local cmd_fn, err = load("return "..cmd); 
    if not cmd_fn then 
        -- there was a syntax error 
        print("Syntax error: "..err); 
    else 
        -- we have now compiled cmd in the form of function cmd_fn(), so we can try to execute it 
        local ok, result_or_error = pcall(cmd_fn) 
        if ok then 
         -- the code was executed successfully, print the returned value 
         print("Result: "..tostring(result_or_error)); 
        else 
         -- runtime error, print error description 
         print("Run error: "..result_or_error) 
        end 
    end 
    
+0

Dies könnte unter einer Bedingung funktionieren. Wenn ich lua frage, einen Wert aus einer void-Funktion zurückzugeben, was wird passieren? – GreenHawk1220

Verwandte Themen