如果只修改字段值,那么`next()`是否有稳定的顺序?
2020-10-19 8:4:33
收藏:0
阅读:107
评论:1
我正在生成一个字符串来表示编码在表格中的状态。该状态将通过更改某些表项的值来改变。我从不会在下面调用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)
-- 在这里,我希望name1和name3相等
print(name1, name2, name3, name1==name3)
这个方法可行且稳定,但是next()官方文档(由pairs()使用)说:
枚举索引的顺序没有指定,即使对于数值索引也是如此。(要按数字顺序遍历表,请使用数值for循环或ipairs函数。)
难道在后续调用pairs()时迭代顺序可能会改变吗?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我建议您不要依赖于没有承诺但可能意外起作用的内容,而是保证您的状态函数具有稳定的遍历顺序。可以像这样完成:
- 用于替换 pairs() 的迭代器: local function ordered_pairs (t) - 获取表键: local keys = {} for key, _ in pairs (t) do table.insert (keys, key) end - 对它们进行排序: table.sort (keys, function (a, b) 本地 type_a,type_b = type (a),type (b) 返回 type_a <type_b 或type_a == type_b且(type_a =='number'或type_a =='string')且a <b 或type_a == type_b且tostring(a)<tostring(b) end) - 循环遍历排序的键: 本地计数器= 1 返回function() 本地键=键 [counter] 如果钥匙呢 计数器=计数器+ 1 返回键,t [key] 结束 end end - 实际上,它是一个串行化器: local function hash (t) 本地串行= {} for key,value在ordered_pairs(t)中进行处理 table.insert (serialised,tostring(key)..':'.. tostring(value)) end 返回table.concat(serialised,',') end - 测试: 本地t = {a = 1,b = 2,c = 3} print('阶段1(b = 2):',hash(t)) t.b = 10 print('阶段2(b = 10):',hash(t)) t.b = 2 print('阶段3(b = 2):',hash(t))首先按顺序排列键(排序函数相当复杂,以考虑所有可能的键类型)。然后按其键的顺序遍历表格。
如果您希望,您可以使用其metatable和__pairs,用ordered_pairs覆盖表格的pairs。