Во-первых, DeadMG прав; вы использовали строку, а не числовой индекс. Однако даже если бы вы использовали числовой индекс, это не помогло бы.
Если вы сделаете это:
someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};
Длина таблицы #someTable
по-прежнему будет 3. Почему? Потому что Lua определяет массивы в таблице на основе смежных элементов. Помните: вы можете получить доступ к любому элементу любой таблицы; все они концептуально заполнены nil
, пока вы не присвоите им фактическое значение.
Lua определяет длину таблицы как количество значений в таблице, если вы начинаете отсчет с числового индекса 1, пока не достигнете первого значения nil
. Поскольку someTable[4]
равно нулю, длина равна 3.
Если вы хотите вставить новый элемент в конец таблицы массива, вы можете сделать это:
someTable[#someTable + 1] = "newValue";
Само значение может быть таблицей:
someTable[#someTable + 1] = {"newValuea", "newValueb"};
Если вы просто спрашиваете, как получить доступ к вложенной таблице, это просто и не имеет ничего общего с используемыми вами ключами.
Во вложенных таблицах нет ничего особенного. Таблицы — это значения, а записи в таблицах могут быть любыми значениями, включая другие таблицы.
Если у вас есть таблица и вы хотите просмотреть записи массива в ней, вы используете это:
local aTable = {"first", "second", "third", ...}
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
Вложенная таблица ничем не отличается; это просто вопрос получения таблицы. локальная вложенная таблица = { "первая", "вторая", "третья", ...} вложенная таблица [# вложенная таблица + 1] = {"новая первая", "новая вторая", ...} локальная таблица = вложенная таблица [# вложенная таблица]; для i значение в ipairs(aTable) do --value
содержит записи в таблице. конец
Или вы могли бы просто сделать ipairs(nestedTable[#nestedTable])
. Обратите внимание, что используемый здесь конкретный ключ (целочисленное значение) совершенно не важен. Этот ключ мог быть строкой, числом с плавающей запятой, другой таблицей, некоторыми пользовательскими данными и т. д. Это не имеет значения.
Также обратите внимание, что мы используем ipairs
, потому что мы хотим перебирать только элементы массива таблицы. Длина массива определена выше. Если бы мы хотели перебрать каждого члена таблицы, мы бы использовали pairs
вместо ipairs
. Конечно, pairs
выполняет неупорядоченный поиск, поэтому не гарантируется, что он будет в порядке массива.
Если вы хотите рекурсивно найти каждый элемент во вложенной таблице, вы можете сделать это:
local function RecursiveSearch(aTable)
for key, value in pairs(aTable) do --unordered search
if(type(value) == "table") do
RecursiveSearch(value)
else
--Do something with this.
end
end
end
Обратите внимание, что приведенное выше может выполнять бесконечный цикл, поскольку таблица может иметь циклические ссылки:
local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.
person
Nicol Bolas
schedule
18.06.2011