Condizioni in linea in Lua (a == b? "Sì": "no")?


95

È comunque possibile utilizzare le condizioni in linea in Lua?

Ad esempio:

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

1
C'è un bell'articolo sul wiki di lua-users sull'operatore ternario, insieme alla spiegazione del problema e diverse soluzioni.
Marcin

Risposte:


126

Sicuro:

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

32
+1 per la risposta. Tuttavia non penso che questo sia strettamente vero - non uso LUA - ma penso che condivida un "difetto" con questo approccio su un operatore ternario in altre lingue. Immagina: il (cond and false-value or x)risultato sarà xin tutti i casi.

1
non verrebbe stampato anche il valore di A?
corsiKa

11
@glowcoder No. "L'operatore di congiunzione (e) restituisce il primo argomento se questo valore è falso o nil; in caso contrario, e restituisce il secondo argomento. L'operatore di disgiunzione (o) restituisce il primo argomento se questo valore è diverso da zero e falso ; in caso contrario, o restituisce il suo secondo argomento. Sia e sia o utilizzano la valutazione scorciatoia, ovvero il secondo operando viene valutato solo se necessario "- da lua.org/manual/5.0/manual.html

3
@pst è corretto che se l'intento è quello a and false or truenon darà la stessa risposta di not a. Questo idioma viene solitamente utilizzato per i casi in cui il valore desiderato se aè vero non può essere falseo nil.
RBerteig

1
Se stai usando questo modulo con le variabili, probabilmente presumi che la seconda variabile non sia falsa, il che significa che dovresti scrivere a and assert(b) or c.
HoverHell

31

Se a and t or fnon funziona per te, puoi sempre creare una funzione:

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

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

ovviamente, poi hai l'inconveniente che T e F vengono sempre valutati ... per aggirare il fatto che devi fornire funzioni alla tua funzione ternaria, e questo può diventare ingombrante:

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

Penso che questo sia il più utile per le variabili booleane
Vyacheslav

1
Questa risposta è in realtà migliore della risposta migliore perché funziona anche per i booleani.
Деян Добромиров

Penso che un caso limite più comune che questa soluzione accoglie sia quando tè nil.
NetherGranite
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.