English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

table (таблица) Lua

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

Lua таблицы используют связные массивы, вы можете использовать любое значение в качестве индекса массива, но это значение не может быть nil.

Lua таблицы не имеют фиксированного размера, вы можете расширять их в зависимости от своих потребностей.

Lua также использует таблицы для решения проблем модулей (module), пакетов (package) и объектов (Object). Например, string.format использует "format" для индексации таблицы string.

Конструкция таблицы (table)

Конструкторы создают и инициализируют таблицы. Таблицы являются уникальной и мощной функцией 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

Операции с таблицами

Ниже перечислены常用 методы для работы с таблицами:

НомерМетод & Назначение
1table.concat (table [, sep [, start [, end]]]):

Concat - это сокращение от concatenate (连锁, соединение). Функция table.concat() перечисляет все элементы массивной части указанной таблицы от позиции start до positions с помощью指定的 разделителя (sep).

2table.insert (table, [pos,] value):

Вставить элемент с значением value в позицию pos в массивной части таблицы. Параметр pos опционален, по умолчанию вставка в конец массивной части.

3table.maxn (table)

Указать максимальный ключ с положительным значением в таблице. Если нет элементов с ключом, имеющим положительное значение, то возвращается 0. (Этот метод больше не существует в Lua 5.2 и в этой статье используется пользовательская функция для его реализации)

4table.remove (table [, pos])

Возвращает часть массива table, расположенную после элемента с позиций pos. Следующие элементы будут передвинуты. Параметр pos опционален, по умолчанию равен длине table, то есть удаляется с последнего элемента.

5table.sort (table [, comp])

Сортировка заданного table по возрастанию.

Давайте рассмотрим примеры этих методов.

Соединение 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

Сортировка Table

Данный пример демонстрирует использование метода 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