Таблица 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

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

Ниже перечислены часто используемые методы для операций с таблицами:

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

concat — это сокращение от concatenate (связывание, соединение). Функция table.concat() перечисляет все элементы части-массива указанной в параметрах таблицы от начальной позиции до конечной, разделяя их указанным разделителем (sep).

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

Вставляет элемент с заданным значением в указанную позицию (pos) в части-массиве таблицы. Параметр pos необязателен и по умолчанию устанавливается на конец части-массива.

3table.maxn (table)

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

4table.remove (table [, pos])

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

5table.sort (table [, comp])

Сортирует указанную таблицу в порядке возрастания.

Теперь рассмотрим примеры этих методов.

Конкатенация таблиц

Мы можем использовать concat(), чтобы вывести строку, сформированную путём конкатенации элементов списка:

Пример

fruits = {"banana","orange","apple"}
-- Возвращает конкатенированную строку таблицы
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

Вставка и удаление

Следующий пример демонстрирует операции вставки и удаления для таблиц:

Пример

fruits = {"banana","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() для сортировки таблицы:

Пример

fruits = {"banana","orange","apple","виноград"}
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, чтобы реализовать его.

В следующем примере показано, как получить максимальное значение в таблице:

Пример

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.getnподсчёт останавливается в точке, где индекс прерывается, что приводит к неверной длине таблицы.

Вместо этого можно использовать следующий метод:

function table_leng(t)
  local leng=0
  for k, v in pairs(t) do
    leng=leng+1
  end
  return leng;
end
Другие расширения