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

88

Gibt es in Lua überhaupt Inline-Bedingungen?

Sowie:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
quelle
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"))
John Zwinck
quelle
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))
Daurnimator
quelle
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