Таблица - это набор пар ключ-значение. Ключом в таблице может быть любое значение, кроме 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
-- > Вася осел
Как видно из печати, порядок элементов в таблице отличается от порядка, в котором значения помещали в таблицу, поскольку внутри хэш-таблицы ключи сортируются по некоему признаку.
Перед публикацией, советую ознакомится с правилами!
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter