English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Таблицы являются одним из данных структур Lua, которые помогают нам создавать различные типы данных, такие как массивы, словари и т.д.
Lua таблицы используют связные массивы, вы можете использовать любое значение в качестве индекса массива, но это значение не может быть nil.
Lua таблицы не имеют фиксированного размера, вы можете расширять их в зависимости от своих потребностей.
Lua также использует таблицы для решения проблем модулей (module), пакетов (package) и объектов (Object). Например, string.format использует "format" для индексации таблицы string.
Конструкторы создают и инициализируют таблицы. Таблицы являются уникальной и мощной функцией Lua. Самый простой конструктор это {}, который создает пустую таблицу. Можно также напрямую инициализировать массив:
-- Инициализация таблицы mytable = {} -- Установка значения mytable[1] = "Lua" -- Удаление ссылок mytable = nil -- Механизм переработки мусора Lua освободит память
Когда мы устанавливаем элементы таблицы a и затем назначаем a b, то a и b указывают на один и тот же участок памяти. Если a установлено в nil Если b также может обращаться к элементам таблицы. Если нет указанного переменной a, механизм переработки мусора Lua очистит соответствующую память.
Следующий пример демонстрирует описанные выше ситуации:
-- Пример таблицы mytable = {} print("Тип mytable: ", type(mytable)) mytable[1] = "Lua" mytable["wow"] = "До изменений" print("Элемент с индексом 1 в mytable: ", mytable[1]) print("Элемент с индексом wow в mytable является ", mytable["wow"]) -- alternatetable и mytable указывают на одну и ту же таблицу alternatetable = mytable print("Элемент с индексом 1 в alternatetable является ", alternatetable[1]) print("Элемент с индексом wow в mytable является ", alternatetable["wow"]) alternatetable["wow"] = "изменен" print("Элемент с индексом wow в mytable является ", mytable["wow"]) -- Освобождение переменных alternatetable = nil print("alternatetable является ", alternatetable) -- mytable все еще доступен print("Элемент с индексом wow в mytable является ", mytable["wow"]) mytable = nil print("mytable является ", mytable)
Результат выполнения кода выше:
Тип mytable является table Элемент с индексом 1 в mytable является Lua Элемент с индексом wow в mytable является до изменения Элемент с индексом 1 в alternatetable является Lua Элемент с индексом wow в mytable является до изменения Элемент с индексом wow в mytable является изменен alternatetable является nil Элемент с индексом wow в mytable является изменен mytable является nil
Ниже перечислены常用 методы для работы с таблицами:
Номер | Метод & Назначение |
---|---|
1 | table.concat (table [, sep [, start [, end]]]): Concat - это сокращение от concatenate (连锁, соединение). Функция table.concat() перечисляет все элементы массивной части указанной таблицы от позиции start до positions с помощью指定的 разделителя (sep). |
2 | table.insert (table, [pos,] value): Вставить элемент с значением value в позицию pos в массивной части таблицы. Параметр pos опционален, по умолчанию вставка в конец массивной части. |
3 | table.maxn (table) Указать максимальный ключ с положительным значением в таблице. Если нет элементов с ключом, имеющим положительное значение, то возвращается 0. (Этот метод больше не существует в Lua 5.2 и в этой статье используется пользовательская функция для его реализации) |
4 | table.remove (table [, pos]) Возвращает часть массива table, расположенную после элемента с позиций pos. Следующие элементы будут передвинуты. Параметр pos опционален, по умолчанию равен длине table, то есть удаляется с последнего элемента. |
5 | table.sort (table [, comp]) Сортировка заданного table по возрастанию. |
Давайте рассмотрим примеры этих методов.
Мы можем использовать concat() для вывода строки, состоящей из соединенных элементов списка:
fruits = {"banana","orange","apple"} -- Возврат соединенного table строки print("Соединенный строкой ",table.concat(fruits)) -- Указание символа соединения print("Соединенный строкой ",table.concat(fruits,", ")) -- Указание индекса для соединения table print("Соединенный строкой ",table.concat(fruits,", ", 2,3))
Выполнение вышеуказанного кода возвращает результат:
Соединенный строкой bananaorangeapple Соединенный строкой banana, orange, apple Соединенный строкой orange, apple
Данный пример демонстрирует операции вставки и удаления в table:
fruits = {"banana","orange","apple"} -- Вставка в конец table.insert(fruits,"mango") print("Элемент с индексом 4 будет ",fruits[4]) -- Вставка в индекс 2 ключа table.insert(fruits,2,"grapes") print("Элемент с индексом 2 будет ",fruits[2]) print("Последний элемент будет ",fruits[5]) table.remove(fruits) print("После удаления последний элемент будет ",fruits[5])
Выполнение вышеуказанного кода возвращает результат:
Элемент с индексом 4 будет mango Элемент с индексом 2 будет grapes Последний элемент будет mango Последний элемент после удаления будет nil
Данный пример демонстрирует использование метода sort() для сортировки Table:
fruits = {"banana","orange","apple","grapes"} print("排序前") for k, v in ipairs(fruits) do print(k, v) end table.sort(fruits) print("Отсортировано") for k, v in ipairs(fruits) do print(k, v) end
Выполнение вышеуказанного кода возвращает результат:
До сортировки 1 banana 2 orange 3 apple 4 grapes Отсортировано 1 apple 2 banana 3 grapes 4 orange
Метод table.maxn уже не существует в Lua5.2 и позже, поэтому мы определили метод table_maxn для его реализации.
Следующий пример демонстрирует, как получить максимальное значение из table:
function table_maxn(t) local mn = nil; for k, v in pairs(t) do if(mn == nil) then mn = v end if mn < v then mn = v end end return mn end tbl = {[1] = 2, [2] = 6, [3] = 34, [26] = 5} print("tbl максимальное значение:", table_maxn(tbl)) print("tbl длина", #tbl)
Выполнение вышеуказанного кода возвращает результат:
tbl максимальное значение: 34 tbl длина 3
Внимание:
Когда мы получаем длину table, используя # или table.getn, они всегда останавливаются в месте разрыва индекса, что приводит к неправильному получению длины table.
Можно использовать следующие методы вместо этого:
function table_leng(t) local leng = 0 for k, v in pairs(t) do leng = leng + 1 end return leng; end