Jos*_*osh 6 lua nested lua-table
由于数字索引,我不确定这是否可能,但希望有人能指出正确的方向。
给定表:
t = { 13, 200, 12, 15, 23 }
Run Code Online (Sandbox Code Playgroud)
如何使用数字嵌套表格?
t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
似乎不起作用,因为它会创建一个位置 200 并用 null 填充空单元格。我会添加一个字母作为后缀/前缀,但问题是试图对表进行数字排序。这是否可能,或者我是否坚持使用不同的方法?谢谢!
由于认识而略有编辑:
t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
实际上创建了一个键“200”,而:
t[200] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
创建索引 200,其他所有内容均为空。
首先,DeadMG是正确的;您使用了字符串而不是数字索引。但是,即使您确实使用了数字索引,也无济于事。
如果你这样做:
someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};
Run Code Online (Sandbox Code Playgroud)
表的长度#someTable仍为3。为什么?因为Lua在表中定义数组是基于连续元素的。请记住:您可以访问任何表的任何元素;它们在概念上都是充满的,nil直到你给它们一个实际的值。
Lua 将表的长度定义为表中值的数量(如果从数字索引 1 开始计数,直到达到第一个nil值)。由于someTable[4]为零,因此长度为 3。
如果你想在数组表的末尾插入一个新元素,那么你可以这样做:
someTable[#someTable + 1] = "newValue";
Run Code Online (Sandbox Code Playgroud)
该值本身可以是一个表:
someTable[#someTable + 1] = {"newValuea", "newValueb"};
Run Code Online (Sandbox Code Playgroud)
如果您只是询问如何访问嵌套表,那很简单,并且与您使用的键无关。
嵌套表没有什么特别的。表是值,表条目可以是任何值,包括其他表。
如果您有一个表,并且想要遍历其中的数组条目,可以使用以下命令:
local aTable = {"first", "second", "third", ...}
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
Run Code Online (Sandbox Code Playgroud)
嵌套表也不例外;这只是获得桌子的问题。
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
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做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
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码可以执行无限循环,因为表可能具有循环引用:
local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.
Run Code Online (Sandbox Code Playgroud)
也许这样查看你的作业会有所帮助:
t = { [1] = 13, [2] = 200, [3] = 12, [4] = 15, [5] = 23 }
Run Code Online (Sandbox Code Playgroud)
要更改当前的内容200(即t[2]),您可以:
t[2] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
编辑:这会导致您的表格看起来像这样:
t = { [1] = 13, [2] = {"stuff", "more stuff", "even more stuff"}, [3] = 12, [4] = 15, [5] = 23 }
-- or, equivalent::
t = { 13, {"stuff", "more stuff", "even more stuff"}, 12, 15, 23 }
Run Code Online (Sandbox Code Playgroud)