Встроенные условия в 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 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.