在表中动态构建子表

时间:2018-09-25 15:32:31

标签: lua

我试图弄清楚如何在lua表中动态构建一系列子表。例如

function BuildsubTable()
   local oTable = {}
   local name  = {"P1","P2"}
  for i = 1, 2 do
    oTable[i] = {name = name[i], "x" = i + 2, "y" = i + 1}
  end
  return oTable
end

预期输出:

 oTable = {
  {name = "P1", "x"=3, "y"=2},
  {name = "P2", "x"=4, "y"=3}
 }

这显然是行不通的,但是您了解了我要做什么。这是一个相当简单的任务,但是在LUA 5.3中证明是困难的。我找不到以这种方式构建表的好例子。任何解决方案或其他想法将不胜感激。在Python中,我将使用类或简单的字典。

3 个答案:

答案 0 :(得分:4)

使用

oTable[i] = {name = name[i], x = i + 2, y = i + 1}

答案 1 :(得分:4)

您的问题是您引用字符串索引。在表构造函数中声明表键的通用语法为[<key>] = <value>,例如[20] = 20["x"] = i + 2

["<key>"] = <value>的简写,即对于有效变量名的字符串索引,您可以编写<key> = <value>,例如x = i + 2

在您的代码中,请同时使用两者并编写{ ..., "x" = i + 2, ... }。谷歌的快速搜索显示,在Python中,您提到的是在字典中引用字符串键,因此您可能将其与Lua混合使用了?

编辑:我注意到这有点晚了,但是您也可以使用ipairs来迭代第一个表,并使用table.insert来插入值:

function BuildsubTable()
    local oTable = {}
    local name  = {"P1","P2"}
    for i,name in ipairs(name) do
        table.insert(oTable, {name = name, "x" = i + 2, "y" = i + 1})
    end
    return oTable
end

答案 2 :(得分:2)

DarkWiiPlayers和lhf的答案是正确的方法。 但是,如果您打算使用字符串作为键,则可以通过以下方法修复当前代码

function BuildsubTable()
   local oTable = {}
   local name  = {"P1","P2"}
  for i = 1, 2 do
    oTable[i] = {name = name[i], ["x"] = i + 2, ["y"] = i + 1}
  end
  return oTable
end

输出

{
    [1] = { ['name'] = 'P1', ['x'] = 3, ['y'] = 2},
    [2] = { ['name'] = 'P2', ['x'] = 4, ['y'] = 3}
}