Lua представляет собой dynamically typed language. Это означает, что переменные не имеют типов, а только значения. Следовательно, не имеется никаких определений типов на языке. Все значения несут их собственный тип. Помимо типа все значения также имеют тэг.
Имеются шесть базисных типов в Lua: nil, number (число), string (строка), function
(функция), userdata (пользовательские
данные) и table (таблица). Nil тип
значения nil, чье основное свойство должно отличаться от любого другого
значения. Number представляет реальные (двойная точность с плавающей
запятой) числа, в то время как string имеет обычное значение. Lua
нормально понимает 8-разрядные символы, так что строки могут содержать любой
8-разрядный символ, включая вложенные нули ('\0'
). Подробности в
разделе 4.1.
Функция type
возвращает строку, описывающую тип данного значения
(подробности в разделе 6.1).
Функции рассматриваются как значения первого класса (first-class
values) в Lua. Это означает, что функции могут быть сохранены в переменных,
переданы как параметры другим функциям и возвращены как результаты. Lua может
вызывать и управлять как функциями, написанными на Lua, так и функциями,
написанными на C. Два вида функций могут различаться их тэгами: все функции Lua
имеют тот же самый тэг, и все функции C имеют свой тэг, который отличается от
тэга функций Lua. Функция tag
возвращает тэг данного значения
(подробности в разделе 6.1).
Тип userdata обеспечивается, чтобы позволить произвольным
C-указателям быть сохраненными в Lua-переменных. Этот тип соответствует
void*
и не имеет никаких предопределенных операций в Lua, за
исключением теста равенства и назначения. Однако, используя методы
тэгов, программист может определять операции для значений
userdata. Подробности в разделе 4.8.
Тип table осуществляет ассоциативные массивы, то есть массивы,
которые могут быть индексированы не только числами, а любыми значениями (за
исключением nil). Следовательно, этот тип может использоваться не только,
чтобы представить обычные массивы, но также и символные таблицы, наборы, записи,
графы, деревья и т.д. Таблицы представляют собой основной механизм,
структурирующий данные в Lua. Чтобы представлять записи (records), Lua использует имя поля как индекс. Язык поддерживает
это представление, обеспечивая a.name
как синтаксический аналог для
a["name"]
. Таблицы могут также нести методы: поскольку
функции представляют собой значения первого класса, поля таблицы могут содержать
функции. Форма t:f(x)
синтаксический аналог для
t.f(t,x)
, который вызывает метод f
из таблицы
t
прохождением таблицы непосредственно как первый параметр
(подробности в разделе 4.5.9).
Обратите внимание, что таблицы представляют собой объекты, а не значения. Переменные не содержат таблицы, только ссылаются на них. Назначение, обработка параметра и возврат всегда управляют ссылками на таблицы и не подразумевают никакого вида копирования. Кроме того, таблицы должны быть явно созданы прежде, чем используются. Подробности в разделе 4.5.7.
Каждый из типов nil, number и string имеет свой
тэг. Вообще, очень многое в Lua построено именно вокруг тэгов. Все значения
каждого из этих типов имеют тот же самый предопределенный тэг. Как объяснено
выше, значения типа function могут иметь два различных тэга в
зависимости от того, являются ли они функциями Lua или функциями C. В
заключение, значения типов userdata и table могут иметь
переменные тэги, назначенные программистом (подробности в разделе
4.8).
Функция tag
возвращает тэг данного значения. Пользовательские тэги
могут быть созданы функцией newtag
. Функция settag
используется, чтобы изменить тэг таблицы (подробности в разделе
6.1).
Тэг значений userdata может быть установлен из C (подробности в разделе
5.7).
Тэги главным образом используются, чтобы выбрать соответствующие методы
тэгов, когда происходят некоторые события. Методы тэгов представляют собой
основной механизм для распространения семантики Lua (подробности в разделе
4.8).