Руководство по Lua

Руководство по Lua

Статьи


Таблицы

Таблица - это набор пар ключ-значение. Ключом в таблице может быть любое значение, кроме nil. Значением  поля в таблице так же может быть любое значение, кроме nil. Cоздание таблицы:

local t = {}

Заполним ее различными типами данных:

t[1] = 10
t["Вася"] = "осел"
t[3] = true

local function f()
    return 1
end

t[f] = "функция"
t["функция"] = f
t.me = t -- тоже самое, что t["me"] = t - ссылка на самого себя
print(t["функция"]()) -- > 1

Таблица может быть проинициализирована при создании:

local t = {1, 2, 3, x = 5, ["Вася"] = "осел"}

Массивы

Если при инициализации таблицы ключи не были указаны, то Lua сама присваивает значениям ключи, начиная с 1.
Внимание! Индексация массивов в Lua начинается с 1, не с 0!

local t = {3, 4, 5}
print(t[1], t[2], t[3]) -- > 3, 4, 5

Важный момент: пока возможно, Lua внутри себя таблицу хранит как массив, а не как хэш - таблицу. Соответственно доступ к элементам таблицы происходит почти так же быстро, как в массивах Си. Поэтому без особой нужды не стоит превращать массив в хэш. Для того, чтобы не нарушать структуру при добавлении и удалении элементов массива стоит пользоваться  библиотекой Lua table.

local t = {1, 2, 3, 4, 5}
table.insert(t, 6) -- добавляет элемент в конец массива. Теперь  t = {1, 2, 3, 4, 5, 6}
table.insert(t, 0, 1) -- вставляет элемент по индексу, сдвигая оставшиеся элементы массива. Теперь  t = {0, 1, 2, 3, 4, 5, 6}
table.remove(t, 3) -- удаляет из таблицы элемент по индексу 3 и сдвигает оставшиеся элементы. Теперь t = {0, 1, 3, 4, 5, 6}

Получение размера массива выполняется оператором #:

local count = #t

Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает  максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы:

local t = {1, [100] = 2}
print(#t) -- > 1, поскольку t[1] не nil, а t[1 + 1] равно nil.

Для массива, в котором значения хранятся одно за другим, оператор # вернет количество элементов в массиве.

Обход элементов таблицы

В общем случае узнать, сколько элементов хранится в таблице Lua, кроме как обойдя все элементы таблицы, нельзя. Исключение - это массивы и оператор # для определения длины массива. Массив обходится обычным циклом for:

local t = {1, 2, 3, "Вася"}
for i = 1, #t, 1 do
    print(t[i])
end

-- > 1
-- > 2
-- > 3
-- > Вася

Обычные таблицы обходятся циклом for с итератором:

local t = {1, 2, x = 4, y = 5, ["Вася"] = "осел"}
for key, value in pairs(t) do
    print(key, value)
end

-- > 1    1
-- > 2    2
-- > y    5
-- > x    4
-- > Вася    осел

Как видно из печати, порядок элементов в таблице отличается от порядка, в котором значения помещали в таблицу, поскольку внутри хэш-таблицы ключи сортируются по некоему признаку.


Работы в порту (грузчик и развозчик)
Работы в порту (грузчик и развозчик)
5-02-2021, 12:00, Скрипты
Смена производителя шин
Смена производителя шин
7-12-2020, 21:22, Скрипты
Cистема уровней
Cистема уровней
22-12-2020, 12:00, Скрипты
Телепорт-панель на DGS
Телепорт-панель на DGS
6-12-2020, 19:16, Скрипты
Movie
В данной публикации отсутствуют комментарии !

Перед публикацией, советую ознакомится с правилами!