为何同一Lua脚本执行结果存在不一致性?
为何同一Lua脚本执行结果存在不一致性?
脚本内容(hello.lua)
obj = { a = 'haha', b = 'jiji', c = { name = 'tom', age = 15 } } for i, v in pairs(obj) do if (i == 'c') then print(i,v.age,v.name) break end print(i, v) end
问题原因
核心原因是Lua中pairs()遍历带非整数键的表时,遍历顺序是不确定的。
你的脚本里的obj使用字符串作为键(a、b、c),这类表的遍历顺序不遵循键的定义顺序,而是由Lua内部哈希表的存储逻辑决定,每次运行时可能出现不同的遍历顺序:
- 若遍历先命中键
c,会直接执行print(i,v.age,v.name)然后触发break,最终只输出c 15 tom; - 若遍历先命中
a、b,则会先输出a haha、b jiji,遇到c时再输出对应内容后终止循环。
解决方法(固定遍历顺序)
如果需要稳定的遍历顺序,可以先定义一个有序的键数组,通过遍历数组来访问表元素:
obj = { a = 'haha', b = 'jiji', c = { name = 'tom', age = 15 } } -- 定义固定顺序的键数组 local orderedKeys = {'a', 'b', 'c'} for _, key in ipairs(orderedKeys) do local val = obj[key] if key == 'c' then print(key, val.age, val.name) break end print(key, val) end
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

