Condições inline em Lua (a == b? “Sim”: “não”)?

89

Existe alguma maneira de usar condições inline em Lua?

Tal como:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
fonte
1
Há um bom artigo na wiki dos usuários lua sobre operador ternário, junto com a explicação do problema e várias soluções.
Marcin

Respostas:

121

Certo:

print("blah: " .. (a and "blah" or "nahblah"))
John Zwinck
fonte
31
1 para a resposta. No entanto, não acho que isso seja estritamente verdadeiro - não uso LUA - mas acho que compartilha uma "falha" com essa abordagem em relação a um operador ternário em outras linguagens. Imagine: (cond and false-value or x)Isso resultará em xem todos os casos.
1
isso também não imprimiria o valor de A?
corsiKa
11
@glowcoder No. "O operador de conjunção (e) retorna seu primeiro argumento se este valor for falso ou nulo; caso contrário, e retorna seu segundo argumento. O operador de disjunção (ou) retorna seu primeiro argumento se este valor for diferente de nulo e falso ; caso contrário, ou retorna seu segundo argumento. Ambos e e ou usam avaliação de atalho, ou seja, o segundo operando é avaliado apenas se necessário "- de lua.org/manual/5.0/manual.html
3
@pst é correto que se a intenção é que a and false or truenão vai dar a mesma resposta que not a. Esse idioma geralmente é usado para casos em que o valor desejado se averdadeiro não pode ser falseou nil.
RBerteig,
1
Se você estiver usando este formulário com variáveis, provavelmente assume que a segunda variável não é falsa, o que significa que você deve escrever a and assert(b) or c.
HoverHell
29

Se o a and t or fnão funcionar para você, você pode apenas criar uma função:

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

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

é claro, então você tem a desvantagem de que T e F são sempre avaliados ... para contornar que você precisa fornecer funções para sua função ternária, e isso pode ficar complicado:

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
fonte
Eu acho que este é o mais útil para variáveis ​​booleanas
Vyacheslav
Na verdade, essa resposta é melhor do que a primeira, porque também funciona para booleanos.
Деян Добромиров
Acho que um caso extremo mais comum que essa solução acomoda é quando té nil.
NetherGranite