Warunki wbudowane w Lua (a == b? „Yes”: „no”)?

89

Czy w Lua można używać warunków inline?

Jak na przykład:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
źródło
1
Na wiki lua-users jest fajny artykuł o operatorze trójskładnikowym, wraz z wyjaśnieniem problemu i kilkoma rozwiązaniami.
Marcin

Odpowiedzi:

121

Pewnie:

print("blah: " .. (a and "blah" or "nahblah"))
John Zwinck
źródło
31
+1 za odpowiedź. Jednak nie sądzę, że jest to do końca prawdą - nie używam LUA - ale myślę, że ma "wadę" z tym podejściem w porównaniu z operatorem potrójnym w innych językach. Wyobraź sobie: (cond and false-value or x)to spowoduje xwe wszystkich przypadkach.
1
czy to nie wypisuje również wartości A?
corsiKa
11
@glowcoder No. "Operator koniunkcji (and) zwraca swój pierwszy argument, jeśli ta wartość jest fałszywa lub nil; w przeciwnym razie, i zwraca drugi argument. Operator rozłączenia (lub) zwraca pierwszy argument, jeśli ta wartość jest różna od nil i false ; w przeciwnym razie, lub zwraca swój drugi argument. Zarówno i, jak i lub używają oceny skrótu, to znaczy, drugi operand jest oceniany tylko w razie potrzeby "- z lua.org/manual/5.0/manual.html
3
@pst ma rację, jeśli intencją jest to, że a and false or truenie da takiej samej odpowiedzi, jak not a. Ten idiom jest zwykle używany w przypadkach, gdy żądana wartość, jeśli ajest prawdziwa, nie może być falselub nil.
RBerteig
1
Jeśli używasz tego formularza ze zmiennymi, prawdopodobnie zakładasz, że druga zmienna nie jest fałszywa, co oznacza, że ​​powinieneś pisać a and assert(b) or c.
HoverHell
29

Jeśli a and t or fto nie zadziała, zawsze możesz po prostu utworzyć funkcję:

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

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

oczywiście, wtedy masz tę wadę, że T i F są zawsze oceniane ... aby obejść, musisz zapewnić funkcje swojej funkcji trójskładnikowej, a to może stać się nieporęczne:

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
źródło
Myślę, że jest to najbardziej przydatne dla zmiennych boolowskich
Wiaczesław
Ta odpowiedź jest w rzeczywistości lepsza niż najlepsza odpowiedź, ponieważ działa również w przypadku wartości logicznych.
Деян Добромиров
Myślę, że bardziej powszechnym przypadkiem krawędzi, który uwzględnia to rozwiązanie, jest kiedy tjest nil.
NetherGranite