Во-первых, 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
Вложенная таблица ничем не отличается; это просто вопрос получения таблицы.
local nestedTable = {"first", "second", "third", ...}
nestedTable [#nestedTable + 1] = {"newFirst", "newSecond", ...}
local aTable = nestedTable [#nestedTable];
для i значение в ipairs (aTable) сделать
- 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.