Conditions en ligne dans Lua (a == b? «Oui»: «non»)?

89

Est-il possible d'utiliser des conditions en ligne dans Lua?

Tel que:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
la source
1
Il y a un bel article sur le wiki de lua-users sur l'opérateur ternaire, ainsi que l'explication du problème et plusieurs solutions.
Marcin

Réponses:

121

Sûr:

print("blah: " .. (a and "blah" or "nahblah"))
John Zwinck
la source
31
+1 pour la réponse. Cependant, je ne pense pas que ce soit strictement vrai - je n'utilise pas LUA - mais je pense qu'il partage un "défaut" avec cette approche sur un opérateur ternaire dans d'autres langues. Imaginez: (cond and false-value or x)cela aboutira xdans tous les cas.
1
cela n'imprimerait-il pas également la valeur de A?
corsiKa
11
@glowcoder No. "L'opérateur de conjonction (et) renvoie son premier argument si cette valeur est fausse ou nulle; sinon, et renvoie son deuxième argument. L'opérateur de disjonction (ou) renvoie son premier argument si cette valeur est différente de nil et faux ; sinon, ou renvoie son deuxième argument. Les deux et ou utilisent une évaluation de raccourci, c'est-à-dire que le deuxième opérande n'est évalué que si nécessaire "- from lua.org/manual/5.0/manual.html
3
@pst a raison de dire que si l'intention est, cela a and false or truene donnera pas la même réponse que not a. Cet idiome est généralement utilisé dans les cas où la valeur souhaitée si aest true ne peut pas être falseou nil.
RBerteig
1
Si vous utilisez ce formulaire avec des variables, vous supposez probablement que la deuxième variable est non fausse, ce qui signifie que vous devez écrire a and assert(b) or c.
HoverHell
29

Si le a and t or fne fonctionne pas pour vous, vous pouvez toujours simplement créer une fonction:

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

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

bien sûr, alors vous avez l'inconvénient que T et F sont toujours évalués ... pour contourner cela, vous devez fournir des fonctions à votre fonction ternaire, et cela peut devenir compliqué:

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))
daurnimateur
la source
Je pense que c'est le plus utile pour les variables booléennes
Vyacheslav
Cette réponse est en fait meilleure que la première réponse car elle fonctionne également pour les booléens.
Деян Добромиров
Je pense qu'un cas limite plus commune que cette solution peut accueillir est quand test nil.
NetherGranite