Логические операторы
-
Существует три логических оператора: and, or, not.
Те, кто уже знаком с языками программирования знают, как эти логические операторы работают.
Например,
A = true B = true if A and B then print('Условие "A and B" выполняется') end if A or B then print('Условие "A or B" выполняется') end B = false if not (B == A) then print('Условие "not (B == A)" выполняется') end
Но, дальше интереснее.
Все логические операторы считают false и nil ложными, а все остальное — истинными. Оператор "and" возвращает свой первый аргумент, если он ложен и в противном случае возвращается второй аргумент Оператор "or" возвращает свой первый аргумент, если он не равен false и в противном случае возвращается второй аргумент.
Сходу можно запутаться, но с примерами станет понятнее
print (4 and 5) --> "5". В этом примере '4" не ложный, а значит при операторе "and" вернется второй аргумент "5". print(0 and 13) --> "0". Аналогично print(false and 13) --> "false". В этом примере первый аргумент false(ложный), а значит при операторе and вернется "false".
print(4 or 5) --> "4" В этом примере "4" не ложный, а значит при операторе "or" вернется уже первый аргумент "4". print(false or 5) --> "5" В этом примере "false" ложный, а значит при операторе "or" вернется уже первый аргумент "5".
Если кто вспомнил, то в C# есть такой оператор "?" (условный)
string result = 4 == 4 ? "равно" : "не равно"; // result будет равен true
На Lua это эквивалентно
local result = ( (4 == 5 and "равно") or "не равно")
А если опустить все скобки, то
local result = 4 < 5 and "равно" or "не равно".
Скобки можно опустить, потому что "and" имеет выше приоритет чем "or."
Или вот еще пример
compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'
Вот такая интересная штука для ускоренного сравнения вместо конструкции
if условие then -- код else -- код end
Идем дальше. Полезной идиомой Lua является
x = x or v
что эквивалентно
if not х then х = v end
Т. е. x равен значению v, когда x ложное.
Оператор "not" всегда возвращает true или false
print(not nil) --> true print(not false) --> true print(not 0) --> false print(not not nil) --> false