我有一些像这样的lua代码:
_table = {
stuff = {
item1 = {Name="Stack",Rarity="Over"};
item2 = {Name="Flow",Rarity="Com"}
};
};
print("placeholder") -- example thing
_stuff = _table.stuff
for i = 1, #_stuff do
print(_stuff[i].Name)
end
输出如下:placeholder
我试着看一些东西,但我认为这与我的问题无关。
Lua表在概念上是"映射":它们将键映射到值。表_table
将键stuff
映射到表{item1 = ..., item2 = ...}
。您的stuff
表将字符串"item1"
映射到{Name="Stack",Rarity="Over"}
表,将字符串"item2"
映射到{Name="Flow",Rarity="Com"}
表。
长度运算符#
完全忽略字符串键。它返回一个整数i
,这样t[i] ~= nil and t[i+1] == nil
。特别是,如果表中没有整数键,它返回0
。这就是stuff
表的情况:您只有字符串键。因此,您的循环永远不会运行,因为限制是0
,而i = 1 > 0
在第一次循环迭代之前已经是这种情况。
简单地说,就是试图遍历一个"字典"。(一个带有字符串键的表)就好像它是一个列表。Lua表既有"列表部分"又有"列表部分"。(从1
到n
的整数键,通常是n = #t
)和一个"哈希部分";(所有其他的钥匙)。"列表"部分在您的例子中为空,因此没有任何东西可供您迭代。
要以未定义的顺序遍历任何表(列表或字典)的所有键值对,请使用pairs
(而不是ipairs
或遍历索引i
,这只适用于列表):
for itemname, item in pairs(_stuff) do
print(item.Name)
end
如果您想要定义迭代顺序,要么构建第二个键表…
local order = {"item1", "item2"}
for _, key in ipairs(order) do
print(_stuff[key].Name)
end
…或者使用表的整数键("list part"):
_table = {
stuff = {
{key = "item1", Name="Stack", Rarity="Over"};
{key = "item2", Name="Flow", Rarity="Com"};
};
};
_stuff = _table.stuff
for _, key in ipairs(order) do
for i = 1, #_stuff do
print(_stuff[i].Name)
end
end
然后按预期工作。