清空表用 t = {} 重新赋值——原表对象没有被清掉,其他持有它的引用(闭包、别的变量、别的模块)还在读旧数据;"清空"实际变成"换了一张新表",旧表成了无人认领的孤儿。错误场景:
local cache = { a = 1, b = 2 }
local view = cache
cache = {}
print(view.a)
view 还拿着旧表——输出 1:重新赋值对持有旧引用的代码没有任何效果,"清空"只清了变量名。
要清同一张表就原地清:pairs 遍历逐键置 nil;只有确认没有任何其他引用时,才允许重新赋值换新表。规范写法。示例代码如下:
local cache = { a = 1, b = 2 }
local view = cache
for k in pairs(cache) do
cache[k] = nil
end
print(view.a)
输出 nil——原地清空,所有引用看到的是同一张空表。
三步验证:用 t = {} 清空祖玛掉落缓存后从别的模块读,读到的仍是旧掉落数据;改原地逐键置 nil 后,所有模块读到空表;顺带验证 pairs 遍历时把当前键置 nil 是安全的——正在遍历的键可以删,遍历中新增键才是禁忌。
原地清空可以封装成通用工具函数,池化复用的标准清法。示例代码如下:
local function clear(t)
for k in pairs(t) do
t[k] = nil
end
end
local cfg = { drop = 10, gold = 20 }
clear(cfg)
print(next(cfg))
next(cfg) 返回 nil——表已空且地址未变,对象池归还前的清理就用这个写法。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:if price < WATCH[goods] then notify end —— 关注降价的…
【游戏】 一、业务场景:赛季结算发现一名玩家胜率 10% 却排在黄金段——历史计分只加不减,积分体系失效 3 个月;积分赛—…
【语法】 一、抛坑提问:3 对括号能组成多少种合法序列?答案是 5——卡塔兰数列:每一项等于前一项乘 2 倍的 2n 减 1…
【语法】 一、抛坑提问:不想用全局随机函数(怕多处共享种子互相干扰),可自实现一个独立随机序列——线性同余法三行核心:乘、加…
【游戏】 一、一行代码拆解:PENDING[outId] = {by = actor, at = now} —— 双人复核的…
【语法】 一、隐蔽陷阱:圆周率小数位背不出更多就不算理解随机模拟?用蒙地卡罗法随机撒点统计,10 万个点能把圆周率估到两位小…