Таблица Lua
Таблица — это структура данных в Lua, которая помогает нам создавать различные типы данных, такие как массивы, словари и т. д.
Таблицы Lua используют ассоциативные массивы. В качестве индексов массива можно использовать значения любого типа, но это значение не может быть nil.
Таблицы Lua не имеют фиксированного размера; их можно расширять по мере необходимости.
Lua также использует таблицы для реализации модулей, пакетов и объектов. Например, 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("элемент mytable по индексу 1 — ", mytable[1])
print("элемент mytable по индексу wow — ", mytable["wow"])
-- alternatetable и mytable ссылаются на одну и ту же таблицу
alternatetable = mytable
print("элемент alternatetable по индексу 1 — ", alternatetable[1])
print("элемент alternatetable по индексу wow — ", alternatetable["wow"])
alternatetable["wow"] = "После изменения"
print("элемент mytable по индексу wow — ", mytable["wow"])
-- Освободить переменную
alternatetable = nil
print("alternatetable — ", alternatetable)
-- mytable всё ещё доступен
print("элемент mytable по индексу wow — ", mytable["wow"])
mytable = nil
print("mytable — ", mytable)
Вывод вышеприведённого кода:
mytable 的类型是 table mytable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 alternatetable 索引为 1 的元素是 Lua alternatetable 索引为 wow 的元素是 修改前 mytable 索引为 wow 的元素是 修改后 alternatetable 是 nil mytable 索引为 wow 的元素是 修改后 mytable 是 nil
Операции с таблицами
Ниже перечислены часто используемые методы для операций с таблицами:
| Нет. | Метод и назначение |
|---|---|
| 1 | table.concat (table [, sep [, start [, end]]]): concat — это сокращение от concatenate (связывание, соединение). Функция table.concat() перечисляет все элементы части-массива указанной в параметрах таблицы от начальной позиции до конечной, разделяя их указанным разделителем (sep). |
| 2 | table.insert (table, [pos,] value): Вставляет элемент с заданным значением в указанную позицию (pos) в части-массиве таблицы. Параметр pos необязателен и по умолчанию устанавливается на конец части-массива. |
| 3 | table.maxn (table) Возвращает наибольшее значение ключа среди всех положительных значений ключей в указанной таблице. Если нет элемента с положительным значением ключа, возвращает 0. (После Lua 5.2 этот метод больше не существует. В этой статье используется реализация пользовательской функции.) |
| 4 | table.remove (table [, pos]) Возвращает элемент в позиции pos в части-массиве таблицы. Последующие элементы сдвигаются вперёд. Параметр pos необязателен и по умолчанию равен длине таблицы, т. е. удаление начинается с последнего элемента. |
| 5 | table.sort (table [, comp]) Сортирует указанную таблицу в порядке возрастания. |
Теперь рассмотрим примеры этих методов.
Конкатенация таблиц
Мы можем использовать concat(), чтобы вывести строку, сформированную путём конкатенации элементов списка:
Пример
-- Возвращает конкатенированную строку таблицы
print("Concatenated string ",table.concat(fruits))
-- Укажите символ-разделитель
print("Concatenated string ",table.concat(fruits,", "))
-- Укажите индексы для конкатенации таблицы
print("Concatenated string ",table.concat(fruits,", ", 2,3))
Вывод вышеприведённого кода:
连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
Вставка и удаление
Следующий пример демонстрирует операции вставки и удаления для таблиц:
Пример
-- Вставить в конец
table.insert(fruits,"mango")
print("Элемент с индексом 4 — ",fruits[4])
-- Вставить по ключу с индексом 2
table.insert(fruits,2,"виноград")
print("Элемент с индексом 2 — ",fruits[2])
print("Последний элемент — ",fruits[5])
table.remove(fruits)
print("После удаления последний элемент — ",fruits[5])
Вывод вышеприведённого кода:
索引为 4 的元素为 mango 索引为 2 的元素为 grapes 最后一个元素为 mango 移除后最后一个元素为 nil
Сортировка таблицы
Следующий пример демонстрирует использование метода sort() для сортировки таблицы:
Пример
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 больше не существует после Lua 5.2. Мы определили метод table_maxn, чтобы реализовать его.
В следующем примере показано, как получить максимальное значение в таблице:
Пример
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.getnподсчёт останавливается в точке, где индекс прерывается, что приводит к неверной длине таблицы.
Вместо этого можно использовать следующий метод:
function table_leng(t) local leng=0 for k, v in pairs(t) do leng=leng+1 end return leng; end