В Lua существует восемь базовых типов: nil, boolean, number, string, function, userdata, thread и table.
Тип nil имеет одно единственное значение nil и означает отсутствие значения. Переменная, которая ещё
не получила значения, и параметр функции, которому при вызове не соответствует ни один из аргументов, имеют значение nil.
Тип boolean (логический) имеет два значения: false (ложь) и true (истина). При преобразовании в boolean
значения другого типа nil преобразуется в false, любое другое значение - в true (в т.ч. число 0!).
Тип number (число) представляет целые и вещественные 64-битные числа. Вещественные константы
содержат дробную часть и/или экспоненциальную, например, 1.5, 1e+10, 1.5e+10. Целые константы
могут быть записаны в десятичном или шестнадцатиричном виде, например, 15, 0xFF0.
Тип string (строка) представляет неизменяемые последовательности байт. Строки в Lua могут
содержать любые символы, включая '\0', и есть возможность хранить символы многобайтных
кодировок (UTF8). Строки-литералы могут записываться в апострофах или кавычках, могут
содержать коды символов в десятичном ('\009') или шестнадцатиричном виде ('\x0A'), коды
символов UTF8 ('\u{463}' - буква ѣ), специальные
символы ('\0' - нулевой байт, '\n' - переход на новую строку, '\t' - символ табуляции). Многострочные
строки могут быть записаны между \[\[ и ]] или \[=\[ и ]=] (количество символов = должно совпадать), переходы
на новую строку в таких строках превращаются в '\n'.
Тип function (функция) содержит ссылку на функцию на языке Lua или пользовательскую функцию.
Тип userdata (пользовательские данные) предназначен для хранения произвольных объектов. Пользовательские
данные не имеют предопределенных операторов в Lua, кроме оператора присвоения (при этом копируется только адрес объекта)
и сравнения на идентичность (аналогично). Значения userdata не могут быть созданы или изменены в Lua.
Используя метатаблицы, программист может определить другие операции и методы через пользовательские функции.
Это гарантирует целостность объектов, которыми владеет основная программа.
Тип thread (поток) представляет независимый поток выполнения и используется для реализации сопрограмм.
Тип table (таблица) реализует ассоциативные массивы, это значит, что массив может быть проиндексирован не
только числами, но и любым Lua-значением, кроме nil и NaN (Not a Number - специальное значение
для представления неопределенных и непредставимых числовых результатов, таких как 0/0). Таблицы
могут использоваться для представления любых сложных структур данных: обычных массивов,
последовательностей, объектов, множеств, ассоциативных таблиц. Можно обращаться к элементам
таблицы a.name или a\['name']. Для создания таблиц используются скобки {}, в которых
можно перечислить значения элементов таблицы (без указания индекса элементы нумеруются
последовательными целыми числами, начиная с 1), либо указать индекс явно в форме имя=значение или \[выражение]=значение.
Элементы таблицы разделяются символами , или ;. Например,
таблица { "x", "y"; x = 7, 5\*5, \[5/2] = "z"; \["1"] = 23; 45 }
содержит 7 значений: