【语法算法】
select 负索引的本质就这一行:
select(-1, ...)
负索引从末尾往前数——-1 是最后一个参数——-2 是倒数第二个——select 负索引的全部语义就这一行。可这一行的妙处在于:select(-1, ...) 让你不用知道参数总数就能拿到最后一个参数。今天拆开。
一、正索引、负索引、总数三段
select 的三段。正索引:select(1, ...) 取第一个参数,select(2, ...) 取第二个——正索引从前往后数。负索引:select(-1, ...) 取最后一个,select(-2, ...) 取倒数第二个——负索引从后往前数。总数:select("#", ...) 返回参数总数——配合负索引可以取"倒数第 n 个"而不用先算总数。三段连起来:select 玩的是"可变参数的灵活访问"——正序遍历用正索引,倒序取值用负索引——两者互补构成完整的参数访问体系。
graph TD
A["select('#', 'a', 'b', 'c')"] --> B["返回 3"]
A --> C["select(1, 'a', 'b', 'c')"]
C --> D["返回 'a'"]
A --> E["select(-1, 'a', 'b', 'c')"]
E --> F["返回 'c'"]
A --> G["select(-2, 'a', 'b', 'c')"]
G --> H["返回 'b'"]
二、负索引的正确写法
local function tail_args(...)
local last = select(-1, ...)
local secondLast = select(-2, ...)
print("最后:", last)
print("倒数第二:", secondLast)
end
tail_args("a", "b", "c")
-- 最后: c
-- 倒数第二: b
select(-1, ...) 不需要知道参数总数——直接从末尾取——比 select(select("#", ...), ...) 简洁得多。
三、负索引的纪律与正负的分界
负索引的分界线是 -1:select(-1) 取最后一个参数——select(0) 是无效索引——Lua 的可变参数从 1 开始计数——0 和负数需要用负索引语义。和正索引的配对使用也值得记:select(i, ...) 取第 i 个参数——i 可以是正数也可以是负数——正数从前往后数,负数从后往前数——两种计数方式在同一个函数里混用时要格外小心。最后一条纪律:负索引在 select("#") 中无意义——select("#") 只做计数不做取值——select("#") 的返回值永远是正整数——负索引只适用于取值场景。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…
【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…
【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…
【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…
【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…
【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…