
Операции
Ниже перечислены основные операции:
- смена знака + - * / арифметика ^ возведение в степень
== ~= равенство
< <= > >= порядок
not and or логика
.. конкатенация строк # получение длины строки или массива |
При применении арифметических операций строки, имеющие числовое значение, приводятся к нему. При конкатенации числовых значений они автоматически преобразуются в строки.
При сравнении на равенство не производится преобразование типов. Объекты разных типов всегда считаются различными.
Соответственно "0" ~= 0, а при индексировании a[0] и a["0"] соответствуют разным ячейкам массива. При сравнении на равенство/неравенство объектов производится сравнение ссылок на объекты. Равными оказываются переменные, ссылающиеся на один и тот же объект.
При выяснении порядка типы аргументов должны совпадать, т.е. числа сравниваются с числами, а строки — со строками.
Отношения равенства и порядка всегда дают в результате true или false т.е. логическое значение.
В логических операциях nil рассматривается как false, а все остальные значения, включая нулевое число и пустую строку — как true.
При вычислении значения используется короткая схема — второй аргумент вычисляется только если это необходимо.
Действует следующая таблица приоритетов и ассоциативности операций:
[right] ^ [left] not # -(unary) [left] * / [left] + - [left] < > <= >= ~= == [right] .. [left] and [left] or |
Логические операции и связанные с ними идиомы
Я надеюсь, вы в курсе, что такое логика в программировании?
Оператор not всегда возвращает логическое значение, принимая аргумент произвольного типа (при этом только значение nil соответствует логическому значению false, остальные же трактуются как true). В отличие от него операторы and и or всегда возвращают один из своих аргументов. Оператор or возвращает свой первый аргумент, если его значение отлично от false и nil и второй аргумент в противном случае. Оператор and возвращает свой первый аргумент, если его значение равно false или nil и второй аргумент в противном случае. Такое поведение основано на том, что все значения, отличные от nil, трактуются как true.
С этим поведением связано несколько общеупотребительных идиом. В следующей таблице слева приведена идиоматическая операция, а справа — эквивалентная обычная запись:
x = x or v if x == nil then x = v end x = (e and a) or b if e ~= nil then x = a else x = b end |
Первая идиома часто используется для присвоения неинициализированной переменной умалчиваемого значения. Вторая идиома эквивалентна C'шному оператору x = e ? a, b (здесь считается, что значение переменной a отлично от nil).