пятница, 4 сентября 2009 г.

Тернарный оператор в Lua

Иногда при скриптинге в Lua встречается следующая конструкция:
if condition then
s = "on"
else
s = "off"
end
В большинстве языков подобная запись легко заменяется тернарным оператором:
s = condition ? "on" : "off"
Однако в Lua тернарный оператор отсутствует. Но не оставлять же такую громоздкую конструкцию?

Выход прост — к нам придут на помощь логические операторы or и and. В Lua для них выполняется следующее:
  • оператор and возвращает первое ложное значение среди сових операндов; если оба операнда истинны, возвращается последний из них
  • оператор or возвращает первое истинное значение среди своих операндов; если оба операнда ложны, возвращается последний из них
Следуя этой нехитрой логике можно записать следующую конструкцию:
s = condition and "on" or "off"
В самом деле, or имеет более низкий приоритет, и поэтому сначала выполняется контрукция с and. Если условие condition истинно, то по логике оператора and возвращается его второй аргумент ("on"). Строчка истинна, и поэтому or возвращает ее как результат всего выражения.

Если же уcловие condition ложно, то оператор and возвращает ложь, и оператор or, получив ложь в качестве первого операнда, возвращает значение второго ("off").

Таким образом, в результате махинаций с логическими операторами мы получили тернарный оператор в Lua!

3 комментария:

  1. Аккуратнее с этими вещами.

    a = true
    b = false — or nil
    c = «oops»
    s = a and b or c
    print(s) –> oops

    ОтветитьУдалить
  2. Интересное замечание, спасибо. Действительно, параметры должны быть не ложными.

    ОтветитьУдалить
    Ответы
    1. ничего интересного — автор по всей видимости плохо прочитал, предоставленное выше описание работы данных операторов. результат приведённый им абсолютно ожидаем и верен

      Удалить