动态构建表格中的子表

我正在尝试想办法在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中,我会使用类或简单的字典。

点赞
用户107090
用户107090

使用

oTable [i] = {name = name [i],x = i + 2,y = i + 1}
2018-09-25 15:42:03
用户4984564
用户4984564

你的问题在于你引用了字符串索引。在表构造器内声明表键的通用语法是[<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
2018-09-25 17:33:01
用户5525442
用户5525442

以下是正确做法,由 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}
}
2018-09-26 02:59:29