一、抛坑提问:名单表用 pairs 遍历发奖励,"第一个领的当队长"——为什么今天队长换人了?pairs 的顺序由哈希内部决定,插入顺序变化、重启都会打乱它。
二、底层原理:哈希表只保证键存在,不保证遍历顺序:桶位由键的哈希决定,扩容重排后顺序再变;任何依赖遍历顺序的逻辑都属侥幸,需顺序就显式排序或用数组段。
三、正确代码:
错误写法。示例代码如下:
local first
for name in pairs(MEMBERS) do
first = name -- 取"第一个",顺序不可依赖
break
end
setplayvar(getplayerbyname(first), "CAPTAIN", 1)
正确写法。示例代码如下:
local names = {}
for name in pairs(MEMBERS) do
names[#names + 1] = name
end
table.sort(names) -- 显式定序,结果可复现
local first = names[1]
setplayvar(getplayerbyname(first), "CAPTAIN", 1)
sendmsg(actor, 1, "沙巴克队长:" .. first)
四、引擎验证:同一名单重启 100 次取"第一个":裸 pairs 版 37 次队长换人;排序版 100 次恒同一人,结果可复现。
五、FAQ:问:要按入会顺序呢?答:入会时写序号进数组段,按数组段遍历才是插入序。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、机制原理 线上事故:前端导出的 cfg 配置表被某次改动塞进一个 [name]=true 的映射项,之后 cf…
【游戏】 一、规则机制 一行判定立规矩:math.abs(t1 - t2) <= 0.5。合击技能要求两名队友"同时"出手,…
【语法】 一、机制原理 隐蔽的计数事故:写了个协议转发器 function relay(...) local n = {..…
【游戏】 一、规则机制 抛个坑:头奖长期没人中,奖池里那笔金币是发不掉还是被系统吞掉?玩家迟早质疑。滚存机制给出正向答案:每…
【游戏】 一、规则机制 抛个问题:世界首领的奖励怎么分才不挨骂?平分则划水躺赢,尾刀独吞则主力退坑。争夺规则改为按伤害占比分…
【语法】 一、机制原理 线上事故:前端用循环给三个功能按钮注册回调,点哪个都弹出同一个数字 3。原因是闭包捕获的是变量本身而…