Inline-Bedingungen in Lua (a == b? "Ja": "Nein")?


88

Gibt es in Lua überhaupt Inline-Bedingungen?

Sowie:

print("blah: " .. (a == true ? "blah" : "nahblah"))

1
Es gibt einen schönen Artikel im Wiki von lua-users über ternäre Operatoren, zusammen mit Problemerklärungen und verschiedenen Lösungen.
Marcin

Antworten:


119

Sicher:

print("blah: " .. (a and "blah" or "nahblah"))

31
+1 für die Antwort. Ich denke jedoch nicht, dass dies streng wahr ist - ich verwende keine LUA -, aber ich denke, dass dieser Ansatz einen "Fehler" gegenüber einem ternären Operator in anderen Sprachen aufweist. Stellen Sie sich vor: (cond and false-value or x)Das führt xin allen Fällen zu.

1
würde das nicht auch den Wert von A drucken?
CorsiKa

11
@glowcoder Nr. "Der Konjunktionsoperator (und) gibt sein erstes Argument zurück, wenn dieser Wert falsch oder null ist. Andernfalls gibt er sein zweites Argument zurück. Der Disjunktionsoperator (oder) gibt sein erstes Argument zurück, wenn sich dieser Wert von null und falsch unterscheidet Andernfalls wird das zweite Operand nur bei Bedarf ausgewertet. "- from lua.org/manual/5.0/manual.html

3
@pst ist richtig, dass, wenn die Absicht ist, a and false or truedas nicht die gleiche Antwort geben wird wie not a. Diese Redewendung wird normalerweise für Fälle verwendet, in denen der gewünschte Wert, wenn er awahr ist, nicht falseoder sein kann nil.
RBerteig

1
Wenn Sie dieses Formular mit Variablen verwenden, nehmen Sie wahrscheinlich an, dass die zweite Variable nicht falsch ist, was bedeutet, dass Sie schreiben sollten a and assert(b) or c.
HoverHell

29

Wenn das a and t or fbei Ihnen nicht funktioniert, können Sie jederzeit eine Funktion erstellen:

function ternary ( cond , T , F )
    if cond then return T else return F end
end

print("blah: " .. ternary(a == true ,"blah" ,"nahblah"))

Natürlich haben Sie dann den Nachteil, dass T und F immer ausgewertet werden. Um dies zu umgehen, müssen Sie Funktionen für Ihre ternäre Funktion bereitstellen, und das kann unhandlich werden:

function ternary ( cond , T , F , ...)
    if cond then return T(...) else return F(...) end
end

print("blah: " .. ternary(a == true ,function() return "blah" end ,function() return "nahblah" end))

Ich denke, dies ist am nützlichsten für boolesche Variablen
Vyacheslav

Diese Antwort ist tatsächlich besser als die Top-Antwort, da sie auch für Boolesche Werte funktioniert.
9еян Добромиров

Ich denke, ein häufigerer Randfall, den diese Lösung berücksichtigt, ist, wann es tist nil.
NetherGranite
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.