3.3 - Логические операторы

Логические операторы - это and, or, and not. Как и управляющие структуры, все логические операторы рассматривают false и nil как Ложь и любое другое значение как Истину. Оператор and возвращает свой первый аргумент, если он Ложь; в противном случае, оператор вернет второй аргумент. Оператор or возвращает первый аргумент, если он Не Ложь; в противном случае, оператор вернет второй аргумент:
    print(4 and 5)         --> 5
    print(nil and 13)      --> nil
    print(false and 13)    --> false
    print(4 or 5)          --> 4
    print(false or 5)      --> 5
Оба оператора, and и or, используют редуцированное вычисление, т.е. обрабатывают второй операнд лишь тогда, когда это необходимо.

Удобна идиома Lua x = x or v, которая эквивалентна

    if not x then x = v end
т.е., x устанавливается в значение v, если x не определена (подразумевается, что x не установлена в false).

Другая полезная идиома - (a and b) or c (или просто a and b or c, т.к. and имеет более высокий приоритет, чем or), которая эквивалентна выражению на С

    a ? b : c
при условии, что b не Ложь. Например, можно выделить максимальное из двух чисел x и y, используя операцию вида
    max = (x > y) and x or y
Когда x > y, первое выражение оператора and Истинно, поэтому результатом and будет второй аргумент (x) (который также Истина, т.к. является числом (напоминаю, что число 0 и значение nil - различны в силу принадлежности к разным типам, прим. переводчика)), и затем or помещает в переменную свой результат, которым является результат первого выражения, т.е. x. В случае, если x > y является Ложью, выражение and вернет false, таким образом результатом or будет его второй аргумент, y.

Оператор not всегда возвращает true or false:

    print(not nil)      --> true
    print(not false)    --> true
    print(not 0)        --> false
    print(not not nil)  --> false

Hosted by uCoz