首先,DeadMG 是正确的;您使用了字符串而不是数字索引。但是,即使您确实使用了数字索引,也无济于事。
如果你这样做:
someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};
表格的长度#someTable 仍将是3。为什么?因为 Lua 根据连续元素在表中定义数组。请记住:您可以访问任何表格的任何元素;它们在概念上都用nil 填充,直到你给它们一个实际值。
Lua 将表的长度定义为表中值的数量,如果您从数字索引 1 开始计数,直到到达第一个 nil 值。由于someTable[4]为nil,所以长度为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];
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
或者你可以直接使用ipairs(nestedTable[#nestedTable])。请注意,此处使用的特定键(整数值)完全不重要。该键可能是一个字符串、一个浮点数、另一个表、一些用户数据等。没关系。
还要注意我们使用ipairs,因为我们只想遍历表的数组成员。数组的长度在上面定义。如果我们想遍历表的每个成员,我们将使用pairs 而不是ipairs。当然pairs是无序搜索,所以不保证是数组顺序。
如果你想递归地查找嵌套表中的每个元素,你可以这样做:
local function RecursiveSearch(aTable)
for key, value in pairs(aTable) do --unordered search
if(type(value) == "table") then
RecursiveSearch(value)
else
--Do something with this.
end
end
end
请注意,上面可以执行无限循环,因为表可能具有循环引用:
local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.