Вбудовані умови в Lua (a == b? "Так": "ні")?


89

Чи є спосіб використовувати вбудовані умови в Lua?

Як от:

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

1
Існує приємна стаття на вікі lua-users про тернарний оператор, а також пояснення проблеми та кілька рішень.
Марсін

Відповіді:


121

Звичайно:

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

31
+1 за відповідь. Однак я не думаю, що це суворо вірно - я не використовую LUA - але я думаю, що це має "недолік" із цим підходом щодо потрійного оператора іншими мовами. Уявіть собі: (cond and false-value or x)це призведе до xв усіх випадках.

1
чи не буде це також надрукувати значення A?
corsiKa

11
@glowcoder No. "Оператор сполучення (і) повертає свій перший аргумент, якщо це значення хибне або нульове; інакше, і повертає свій другий аргумент. Оператор диз'юнкції (або) повертає свій перший аргумент, якщо це значення відрізняється від нуля та хибного ; інакше, або повертає свій другий аргумент. Обидва і та використовують скорочену оцінку, тобто другий операнд обчислюється лише за необхідності "- з lua.org/manual/5.0/manual.html

3
@pst правильно, що якщо намір такий, a and false or trueто не буде давати таку ж відповідь, як not a. Ця ідіома зазвичай використовується для випадків, коли бажаним значенням aістини не може бути falseабо nil.
RBerteig

1
Якщо ви використовуєте цю форму зі змінними, ви, мабуть, вважаєте, що друга змінна не є хибною, що означає, що вам слід писати a and assert(b) or c.
HoverHell

29

Якщо a and t or fце не працює у вас, ви завжди можете просто створити функцію:

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

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

звичайно, тоді у вас буде витяг, що T і F завжди обчислюються .... щоб обійти, що вам потрібно надати функції для вашої потрійної функції, і це може стати громіздким:

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

Я думаю, що це найкорисніше для булевих змінних
В’ячеслав

Ця відповідь насправді краща за верхню, тому що вона працює і для логічних типів.
Деян Добромиров

Я думаю, що найпоширеніший крайній випадок, який це рішення вміщує, це коли tє nil.
NetherGranite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.