Lua 中的嵌套表和数字键

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,其他所有内容均为空。

Nic*_*las 5

首先,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)


Jas*_*ijn 5

也许这样查看你的作业会有所帮助:

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)