【问题标题】:Nested tables and numerical keys in LuaLua 中的嵌套表和数字键
【发布时间】:2011-09-17 22:36:37
【问题描述】:

由于数字索引,我不确定这是否可能,但希望有人能指出正确的方向。

给定表格:

t = { 13, 200, 12, 15, 23 }

如何使用数字嵌套表格?

t["200"] = {"stuff", "more stuff", "even more stuff"}

似乎不起作用,因为它会创建一个位置 200 并用 null 填充空单元格。我会添加一个字母作为后缀/前缀,但问题在于尝试对表格进行数字排序。这甚至可能吗,还是我坚持使用不同的方法?谢谢!

由于实现而略有编辑:

t["200"] = {"stuff", "more stuff", "even more stuff"}

实际上创建了一个“200”的键,而:

t[200] = {"stuff", "more stuff", "even more stuff"}

创建索引 200,其他所有内容为空。

【问题讨论】:

    标签: lua nested lua-table


    【解决方案1】:

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

    【讨论】:

    • 不过,我不想添加新元素。我想通过使其成为嵌套表来编辑现有元素(例如,在本例中为 200)。所以理想情况下,我想用 t[200] 检索该表,并在未来对内部表进行 foreach。
    • @Josh:您最初的问题集中在将元素 200 添加到表中如何导致列表末尾和元素 200 之间的条目被“nil”填充。我在我的答案中添加了一个部分,处理如何遍历嵌套表。
    【解决方案2】:

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

    t = { [1] = 13, [2] = 200, [3] = 12, [4] = 15, [5] = 23 }
    

    要更改当前的200(即t[2]),您可以:

    t[2] = {"stuff", "more stuff", "even more stuff"}
    

    编辑:这会导致您的表格如下所示:

    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 }
    

    【讨论】:

      【解决方案3】:

      问题在于你使用了“”。您的表t 包含一堆数字,并且您正在输入一个字符串 作为键。你想遍历表并做一些你没有特别好的定义的事情。但是,您不能在迭代时添加到表中,因此您可能需要做一些有趣的事情。

      t = { 13, 200, 12, 15, 23 }
      newt = {};
      for key, value in pairs(t) {
          newt[value] = { }; 
      }
      

      这将在 newt 中创建一个表条目,其中键是表 t 中的一个值,用于 t 中的所有值。

      【讨论】:

      • 好的,接下来,我将如何调用这些值?这些数字之所以随意,是因为它们代表了我玩的 MUD 上不同级别的设备。所以我将不同的设备存储在每个级别的键中。如果我想取回那个关卡的装备,我会叫什么? newt[level] 还是 t[newt[level]]?还是别的什么?
      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2014-08-12
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多