Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[Обучение] Основы Lua.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
66.67 Кб
Скачать

Переменные

В Lua переменные не нужно описывать. Переменная появляется в момент ее первого использования. Если используется переменная, которая не была предварительно инициализирована, то она имеет значение nil. Переменные не имеют статического типа, тип переменной определяется ее текущим значением.

Переменная считается глобальной, если она явно не объявлена как локальная. Объявление локальных переменных может быть расположено в любом месте блока и может быть совмещено с их инициализацией:

local x, y, z

local a, b, c = 1, 2, 3

local x = x

При инициализации локальной переменной справа от знака равенства вводимая переменная еще не доступна и используется значение переменной, внешней по отношению к текущему блоку. Именно поэтому корректен пример в третьей строке (он демонстрирует часто используемую идиому языка).

Для локальных переменных интерпретатор использует лексические области видимости, т.е. область действия переменной простирается от места ее описания (первого использования) и до конца текущего блока. При этом локальная переменная видима в блоках, внутренних по отношению к блоку, в котором она описана. Локальная переменная исчезает при выходе из области видимости. Если локальная переменная определена вне блока, то такая переменная исчезает по окончании исполнения этого участка кода, поскольку участок кода выполняется интерпретатором как безымянная функция. Инициализированная глобальная переменная существует все время функционирования интерпретатора.

Для удаления переменной ей можно просто присвоить значение nil.

Массивы, функции и userdata являются объектами. Все объекты анонимны и не могут быть значением переменной.

Переменные хранят ссылки на объекты. При присваивании, передаче в функцию в качестве аргумента и возвращении из функции в качестве результата не происходит копирование объектов, копируются только ссылки на них.

Таблицы

Таблицы (тип table) соответствует ассоциативным массивам, которые можно индексировать любыми значениями кроме nil и которые могут одновременно содержать значения произвольных типов кроме nil. Элементы таблицы можно индексировать и объектами  —  таблицами, функциями и объектами типа userdata. Элементы массива, не получившие значения в результате присваивания, имеют по умолчанию значение nil.

Таблицы  —  основная структура данных в Lua. С их помощью представляются также структуры, классы и объекты. В этом случае используется индексирование строковым именем поля структуры. Поскольку элементом массива может быть функция, в структурах допускаются также и методы.

Для индексирования массивов используются квадратные скобки: array[index]. Запись struct.field эквивалентна следующей записи: struct["field"]. Эта синтаксическая особенность позволяет использовать таблицы в качестве записей с поименованными полями.

Конструктор таблицы  —  это выражение, создающее и возвращающее новую таблицу. Каждое выполнение конструктора создает новую таблицу. Конструктор таблицы представляет собой заключенный в фигурные скобки список инициализаторов полей (возможно пустой), разделенных запятой или символом ';' (точка с запятой). Для инициализаторов полей допустимы следующие варианты:

[exp1] = exp2 table[exp1] = exp2

name = exp table["name"] = exp

exp table[j] = exp

В последнем случае переменная j пробегает последовательные целые значения, начиная с 1. Инициализаторы первых двух видов не изменяют значение этого счетчика. Вот пример конструирования таблицы:

x = { len = 12, 11, 12, [123] = 1123 }

После выпонения такого оператора поля таблицы получат следующие значения:

x["len"] = x.len = 12

x[1] = 11

x[2] = 12

x[123] = 1123

Если последним элементом списка инициализаторов является вызов функции, то возвращаемые функцией значения последовательно помещаются в список инициализаторов. Это поведение можно изменить, заключив вызов функции в круглые скобки. В этом случае из всех возвращаемых функцией значений используется только первое.

После последнего инициализатора может идти необязательный символ-разделитель инициализаторов полей (запятая или точка с запятой).