【发布时间】:2021-02-01 23:53:15
【问题描述】:
我正在生成一个字符串来表示在表格中编码的状态。状态将通过更改某些表条目的值来更改。我永远不会(在下面调用mkName() 之后)在表中添加或删除键。
我希望字符串是表中状态的一种“规范名称”,因此如果我更改表中的值然后将它们改回来,我希望该“名称”再次相同。目前我直接在我的桌子上使用pairs() 来读取它的所有值。该遍历顺序在值变化时是否稳定?
我的代码是这样的
local function mkName(t)
local name = ""
for k, v in pairs(t) do name = name .. k .. ":" .. v .. "," end
return name
end
local state = { a=1, b=2, c=3 }
local name1 = mkName(state)
state.b = 10
local name2 = mkName(state)
state.b = 2
local name3 = mkName(state)
-- Here I want name1 and name3 to be equal
print(name1, name2, name3, name1==name3)
这在我想要的意义上有效并且稳定,但next()(pairs() 使用)的官方文档说:
未指定枚举索引的顺序,即使对于数字索引也是如此。 (要按数字顺序遍历表,请使用数字 for 或 ipairs 函数。)
对于后续调用pairs(),迭代顺序可能会改变有什么原因吗?
【问题讨论】:
-
这能回答你的问题吗? Lua in pairs with same order as it's written
-
如果key1和key2之间存在hash冲突,那么
pairs遍历它们的顺序取决于分配给这些key的顺序。 -
您应该在构建连接之前手动按字母顺序对键进行排序。
-
@PatrickBeynio 经过一番思考后给出了答案:"In Lua, the order that pairs iterates through the keys is unspecified." 可以理解为“订单可能不稳定”,尽管他们没有给出任何参考。