学过其它语言或字符串负下标后,以为 t[-1] 取末尾元素——Lua 表的负数下标是合法的哈希键,指向一个从未赋值的键,得到 nil;数组部分只有 1 到 n,负数与 0 是另一片存储区。错误场景:
local drops = { "祖玛头像", "绿宝石", "裁决之杖" }
print(drops[-1])
输出 nil——既不是绿宝石也不是裁决之杖,t[-1] 只是这张表里一个独立的空键。
取末尾元素用 #drops 做长度算术,倒数语义自己表达。规范写法。示例代码如下:
local drops = { "祖玛头像", "绿宝石", "裁决之杖" }
print(drops[#drops])
输出 裁决之杖——#t 是数组末尾的正确表达,不靠下标魔法。
三步验证:打印 t[-1] 得 nil 复现误解;给 t[-1] 赋一个值再看 #t——数组长度纹丝不动(负数键进了哈希区);用 pairs 遍历整表,确认 -1 与 1、2、3 同时存在于一张表里,只是分区不同。
需要"倒数第 n 个"语义时,用长度算术显式表达。示例代码如下:
local drops = { "祖玛头像", "绿宝石", "裁决之杖" }
local n = #drops
print(drops[n - 1])
输出 绿宝石——倒数第 2 个写成 drops[n - 1],意图清晰且不依赖任何隐式约定。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 任务链按 next 映射逐格跳转,怀疑某条链绕回了旧节点。用 visited 表记录走过的节点能判环…
【游戏】 一、业务场景 交易行里有人收了定金就消失,买家吃闷亏还没处查底细。信用分规则上线:每笔成交双方互评,好评加 2 分…
【语法】 一、隐蔽陷阱 运营报表里"截止第 3 关的最高分"显示 40,可那一批数据里确实出过 120。数据没丢,问题出在统…
【游戏】 一、业务场景 玩家反映:花 30 金锭重随一件武器,好不容易出了一条攻击加成,下一轮重随又把它洗没了,连洗 8 次…
【语法】 一、隐蔽陷阱 把 1000 个金币打包成不超过 25 个包裹,单包容量多大才够?从 1 开始逐个容量去试要跑上千次…
【游戏】 一、业务场景 帮会仓库积了 80 万资金,帮众修装备要借钱,之前的写法是谁申请谁直接扣款,一周被冒领 12 万。资…