【语法】
一、机制原理
隐蔽的计数事故:写了个协议转发器 function relay(...) local n = #{...} end,某天上游传了含 nil 的参数包,中间的参数全部被截丢。根因是 {...} 遇到 nil 会截断尾部,# 数出来的是残包。select 才是可变参数的正解:select("#", ...) 返回真实个数(含 nil 位),select(n, ...) 取第 n 个起的整段,table.unpack 再把段摊开调用。996 前端的网络层分发、GUI 事件透传都是"参数原样转发"的场景,转发器必须数得准、传得全。
二、错误写法
-- 错误:表打包遇 nil 截断
local function relay(...)
local args = {...}
send(#args, unpack(args))
end
三、正确写法
local function relay(...)
local n = select("#", ...)
send(n, ...)
end
local function show(a, b, c)
local p = getplayerbyname("sel01")
sendmsg(p, 1, tostring(a) .. tostring(b) .. tostring(c))
end
show(1, nil, 3)
四、引擎验证
传 (1, nil, 3) 时 select("#") 数出 3,原样转发后目标函数三参俱在;空调用数出 0,不会误发。
五、FAQ
问:select("#") 会慢吗?
答:只是数参数,开销可忽略,比打包成表还省。
问:只要第 2 个参数呢?
答:select(2, ...) 取余段,取单个再配 unpack。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 拆一行代码: 一个格子的数字、周围没翻开的格子数、周围已插的旗数——三者相等的那一刻,剩余未开格全是雷。扫雷的…
【游戏功能】 夺旗为什么比杀人有意思?因为旗子是"带得走的胜利":拔旗只要一瞬,背回家才是全程——从拔到旗那一刻起,背旗的人…
【游戏功能】 空投为什么让人疯狂?箱子还没落地,地图上八个方向的人已经在往落点狂奔——空投的魔力不在箱子本身,在于它把"好东…
【游戏功能】 棋牌室里流传一句老话:新手看自己的棋,高手看对手的棋。五子棋 AI 的写法恰好是这句话的注脚——只会给自己找连…
【游戏功能】 拆一行代码: 把朝向原地翻转一百八十度——回马枪的全部机关就这一行。佯装败退的人在追兵眼皮底下突然回头,枪尖从…
【游戏功能】 擂台上演过一幕静悄悄的事故:一个法师对着两人小队放大招,闪电劈在甲身上,乙毫发无伤地站在半步之外看戏——事后他…