2.2 – Значения и типы
Lua представляет собой язык с динамическим
определением типов данных. Переменная языка может содержать значения любого
типа. Возможности определения пользовательских типов данных отсутствуют. Все значения
в Lua могут
храниться в переменных, использоваться в качестве аргументов при вызове функций
и возвращаться в виде результата их выполнения.
В Lua восемь основных типов: nil (неопределенный), boolean (логический), number (числовой), string (строковый), function (функция), userdata (пользовательские данные),
thread (поток),
и table (таблица).
Nil - это тип значения nil [пустое значение], главное свойство
которого – отличаться от всех остальных значений и обозначать отсутствие
пригодного значения. К типу Boolean относятся значения false (ложь) и true (истина). Значения nil и
false считаются ложными, любое другое значение считается истинным.
К типу Number относятся вещественные числа (двойной точности с плавающей
запятой). (Легко можно сделать сборку интерпретатора Lua с другим внутренним представлением чисел, достаточно изменить
определение в файле luaconf.h.). Тип
String обозначает массивы символов. Строки Lua могут содержать
любые 8 битные символы, включая ноль ('\0')
(смотреть §2.1).
В Lua можно использовать функции, написанные на Lua и на C (смотреть §2.5.8).
Тип userdata (пользовательские данные) позволяет хранить любые данных из C в переменных Lua. Значение этого типа является
ссылкой на блок физической памяти и не имеет предопределенных операций в Lua, за исключением
присваивания и проверки на равенство. Однако, используя метатаблицы, програмист
может определить операции над значениями этого типа (смотрите §2.8).
Значения типа userdata
не могут быть созданы или изменены непосредственно в Lua, это возможно только с помощью C API. Такой подход гарантирует
целостность данных, принадлежащих ведущей программе.
Тип thread (поток) обозначает независимый поток исполнения и используется
при реализации механизма сопрограмм (смотрите §2.11). Нельзя
отождествлять потоки Lua с потоками операционной системы. Lua поддерживает
подпрограммы даже в тех системах, где потоки на уровне операционной системы не
поддерживаются.
Тип table (таблица) определяет ассоциативные массивы. Такие
массивы могут индексироваться не только числами, но и любыми значениями (за
исключением nil).
Таблица может содержать значения сразу
нескольких типов (кроме nil).
Таблицы представляют собой единственный механизм структурирования данных в Lua; они могут использоваться как простые массивы,
таблицы сиволов, множества, поля
записей, деревья и так далее. Для представления словарей Lua использует
имя поля в качестве индекса таблицы. Представление в виде a.name считается тождественным представлению a["name"]. В Lua есть несколько
способов создания таблиц (смотреть §2.5.7).
Индексы и значения полей таблицы могут быть любого типа (кроме nil). В частности, так как
функции являются значениями встроенного типа, поля таблицы могут содержать и
функции. Таким образом, таблицы могут хранить методы methods (смотреть §2.5.9).
Переменные типа table, function, thread и userdata не
содержат самих данных, в них хранятся только ссылки на соответствующий объект. Присваивание,
передача параметров и возврат результата из функции оперируют только ссылками
на значения, эти операции никогда не ведут к созданию копий.
Библиотечная функция type возвращает
строку, описывающую тип данного значения.
|