【语法算法】
table.unpack 的范围本质就这一行:
local a, b, c = table.unpack(t, 1, 3)
从表的第 1 个元素到第 3 个元素解包为独立变量——table.unpack 的全部机制就这一行。可这一行的中间有两个参数控制范围:起始索引和结束索引——不解包全表只解包指定范围。今天拆开。
一、全量、范围、截取三段
unpack 的三段。全量:table.unpack(t) 不传范围参数——解包从索引 1 到 #t 的所有元素——全量解包是多返回值的基础。范围:table.unpack(t, start, end) 传入起始索引和结束索引——只解包指定范围内的元素——范围解包让"取表的某一段"变成一行代码。截取:范围超出表长度时多余的返回 nil——table.unpack(t, 1, 10) 表只有 3 个元素——第 4 到第 10 个返回 nil——nil 的截断需要调用方处理。三段连起来:unpack 玩的是"表到多值的转换"——表是一个容器,unpack 把容器里的内容拆成独立值。
graph TD
A["t = {10, 20, 30, 40}"] --> B["table.unpack(t)"]
B --> C["返回 10, 20, 30, 40"]
A --> D["table.unpack(t, 2, 3)"]
D --> E["返回 20, 30"]
A --> F["table.unpack(t, 3)"]
F --> G["返回 30, 40"]
二、范围解包的正确写法
local t = {10, 20, 30, 40, 50}
local a, b, c = table.unpack(t, 1, 3)
print(a, b, c) -- 10, 20, 30
local d, e = table.unpack(t, 3, 4)
print(d, e) -- 30, 40
-- 配合select跳过指定数量
local function skipAndLog(n, ...)
local args = table.pack(...)
for i = n + 1, args.n do
print("arg", i, args[i])
end
end
table.unpack(t, 3) 只传起始索引不传结束索引——从第 3 个解包到表尾——返回值个数不确定——适合配合多返回值接收。
三、范围解包与 select 的配合
范围解包和 select 的配合是可变参数处理的核心:select(n, ...) 截取第 n 个之后的参数——table.unpack(t, n) 截取表中第 n 个之后的元素——两者是"同一件事的两种写法"——select 适合在函数体内逐个处理,unpack 适合一次性转成多返回值。最后一条纪律:unpack 的性能比 select 高——unpack 是一次性 C 级调用,select 是 Lua 级循环——参数数量多的时候 unpack 更高效——但参数需要逐个处理时 select 更灵活。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…
【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…
【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…
【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…
【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…
【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…