Встроенные условия в Lua (a == b? «Да»: «нет»)?

89

Есть ли способ использовать встроенные условия в Lua?

Такие как:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
источник
1
В вики lua-users есть хорошая статья о тернарном операторе, вместе с объяснением проблемы и несколькими решениями.
Марчин

Ответы:

121

Конечно:

print("blah: " .. (a and "blah" or "nahblah"))
Джон Цвинк
источник
31
+1 за ответ. Однако я не думаю, что это строго верно - я не использую LUA - но я думаю, что у него есть «недостаток» с этим подходом по сравнению с тернарным оператором в других языках. Представьте себе: (cond and false-value or x)это приведет к xво всех случаях.
1
не будет ли это также напечатать значение A?
corsiKa 02
11
@glowcoder Нет. "Оператор конъюнкции (и) возвращает свой первый аргумент, если это значение равно false или nil; в противном случае и возвращает свой второй аргумент. Оператор дизъюнкции (или) возвращает свой первый аргумент, если это значение отличается от nil и false ; в противном случае или возвращает свой второй аргумент. Оба and and or используют сокращенную оценку, то есть второй операнд оценивается только в случае необходимости »- из lua.org/manual/5.0/manual.html
3
@pst верен в том, что если намерение таково, a and false or trueне даст того же ответа, что и not a. Эта идиома обычно используется в тех случаях, когда желаемое значение if atrue не может быть falseили nil.
RBerteig 03
1
Если вы используете эту форму с переменными, вы, вероятно, предполагаете, что вторая переменная не является ложной, что означает, что вам следует написать a and assert(b) or c.
HoverHell 08
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 05