table.insert 有两种调用形态:insert(t, v) 末尾追加、insert(t, pos, v) 指定位置插入,学员把两种形态混着记,写出 insert(t, #t, v) 想插到末尾——实际 #t 是倒数第二个位置,新元素插在末位元素前面,队列顺序悄悄错一位。还有人写 insert(t, #t + 5, v),位置超过表长加一,直接报错 bad argument。错误场景:
local queue = {"甲", "乙", "丙"}
table.insert(queue, #queue, "丁")
结果 queue 是 {"甲", "乙", "丁", "丙"},丁没有排到末尾。
末尾追加一律用两参形态,让表自己管长度;只有插队、插序这类需求才用三参形态。沙巴克攻城报名:正常报名追加队尾,赞助 10 万金币的行会插队到首位。示例代码如下:
local signs = {}
local function signUp(gName)
table.insert(signs, gName)
sendmsg(nil, 1, gName .. " 报名攻城,当前第 " .. #signs .. " 位。")
end
local function signUpFirst(gName)
table.insert(signs, 1, gName)
sendmsg(nil, 1, gName .. " 赞助 10 万金币插队,当前第 1 位。")
end
三参形态插入位置 1 时,原队首及后续元素整体后移一位,表长加一。示例代码如下:
local t = {"A", "B", "C"}
table.insert(t, 2, "X")
t 变为 {"A", "X", "B", "C"},X 占据位置 2,B、C 依次后移。
三步验证:两参形态连续插入 5 次后 #t 应为 5 且顺序与插入顺序一致;三参形态插入位置 1 后打印全表,核对队首是否为新元素;故意写 insert(t, #t + 5, v) 观察报错信息,记住合法位置上限是 #t + 1。
没有现成的"删除指定元素"接口时,可以先用循环找到位置再 remove;但注意 insert 与 remove 的位置参数都以 1 为起点,与 string.sub 的起点约定一致,混用 0 起点的习惯会整体错位。示例代码如下:
local function removeByValue(t, v)
for i = 1, #t do
if t[i] == v then
return table.remove(t, i)
end
end
return nil
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 攻城战阵亡只有损失:装备掉落、耐久磨损——牺牲没有补偿,行会的伤亡成本全由个人承担,指挥不敢打硬仗。抚恤金设计:攻…
设计初衷 攻城战一触即发,盟友帮会口头答应协防却总是人没到:跨帮支援没有调度与结算机制,人情协防全凭自觉。协防系统设计:盟约…
底层原理 一张地图上 500 棵同款树,每棵存完整的模型数据——重复数据存 500 份。享元模式把不变的部分(模型、贴图)抽…
底层原理 技能系统按"元素×形态"组合:火球冰球乘单体群攻——每加一种元素或一种形态,组合数量乘性增长(4 元素 3 形态 …
设计初衷 稀缺产出(强化石、晋级材料)的供需错位:产出季价格崩盘、断供季价格飞天——剧烈波动伤害生产者与消费者两端。期货交易…
业务场景 驻地巡逻 AI 只会沿固定路线走:玩家摸清路线后绕行如入无人之境。傀儡机关封装:机关傀儡按"巡逻、警戒、袭扰"三态…