我试图弄清楚如何在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中,我将使用类或简单的字典。
答案 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}
}