¿Condiciones en línea en Lua (a == b? “Sí”: “no”)?

88

¿Hay alguna forma de utilizar condiciones en línea en Lua?

Como:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
fuente
1
Hay un buen artículo en la wiki de lua-users sobre el operador ternario, junto con la explicación del problema y varias soluciones.
Marcin

Respuestas:

120

Por supuesto:

print("blah: " .. (a and "blah" or "nahblah"))
John Zwinck
fuente
31
+1 por la respuesta. Sin embargo, no creo que esto sea estrictamente cierto, no uso LUA, pero creo que comparte un "defecto" con este enfoque sobre un operador ternario en otros idiomas. Imagínese: (cond and false-value or x)eso resultará en el xen todos los casos.
1
¿No imprimiría eso también el valor de A?
corsiKa
11
@glowcoder No. "El operador de conjunción (y) devuelve su primer argumento si este valor es falso o nulo; de lo contrario, devuelve su segundo argumento. El operador de disyunción (o) devuelve su primer argumento si este valor es diferente de nil y falso ; de lo contrario, o devuelve su segundo argumento. Tanto yo como
3
@pst tiene razón en que si la intención es esa a and false or trueno va a dar la misma respuesta que not a. Este modismo se usa generalmente para casos en los que el valor deseado si aes verdadero no puede ser falseo nil.
RBerteig
1
Si está utilizando este formulario con variables, probablemente asuma que la segunda variable no es falsa, lo que significa que debe escribir a and assert(b) or c.
HoverHell
29

Si a and t or fno funciona para usted, siempre puede crear una función:

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

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

por supuesto, entonces tiene el inconveniente de que T y F siempre se evalúan ... para evitar que necesita proporcionar funciones a su función ternaria, y eso puede volverse difícil de manejar:

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
fuente
Creo que este es el más útil para las variables booleanas
Vyacheslav
Esta respuesta es en realidad mejor que la respuesta principal porque también funciona para booleanos.
Деян Добромиров
Creo que un caso de borde más común que se adapta a esta solución es cuando tes nil.
NetherGranite