CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+泛型for的四种形态:从简单到完整的进化本质

2026-09-29 16:46 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

泛型 for 的四种形态就这两行:

lua
for k, v in pairs(t) do end         -- 形态1: pairs
for i, v in ipairs(t) do end        -- 形态2: ipairs
for k, v in next, t do end          -- 形态3: next
for k, v in iter, state, ctrl do end -- 形态4: 自定义

泛型 for 的四种形态覆盖了 Lua 所有的遍历需求——从无序遍历到有序遍历到自定义遍历——四种形态的进化就是 Lua 遍历能力的全貌。今天拆开。

一、pairs、ipairs、next、自定义四段

泛型 for 的四段。pairs:无序遍历所有键值对——哈希表和数组部分一起遍历——遍历顺序不确定。ipairs:有序遍历数组部分——从索引 1 开始逐个遍历——遇到 nil 停止——只遍历连续的数组部分。next:底层遍历原语——手动控制遍历进度——可以暂停和恢复——最灵活但也最繁琐。自定义:迭代器函数自行定义"下一个"的语义——可以按任何规则遍历任何数据结构——泛型 for 的终极形态。四段连起来:泛型 for 玩的是"遍历规则的可插拔"——for 循环只管调用迭代函数,遍历规则由迭代函数决定——规则变了循环体不用改。

mermaid
graph TD
    A["泛型for"] --> B["pairs: 无序遍历"]
    A --> C["ipairs: 数组有序"]
    A --> D["next: 底层原语"]
    A --> E["自定义: 任意规则"]
    B --> F["遍历顺序不确定"]
    C --> G["从1到#t逐个"]
    D --> H["手动控制进度"]
    E --> I["按自定义规则遍历"]

二、四种形态的正确写法

lua
-- 形态1: pairs 无序遍历
local t = { name = "勇者", level = 42, job = "战士" }
for k, v in pairs(t) do
    print(k, v)
end

-- 形态2: ipairs 数组有序遍历
local arr = {"a", "b", "c"}
for i, v in ipairs(arr) do
    print(i, v)
end

-- 形态3: next 底层遍历
local k, v = next(t)
while k ~= nil do
    print(k, v)
    k, v = next(t, k)
end

-- 形态4: 自定义迭代器——倒序遍历
local function reverseIter(t)
    local i = #t + 1
    return function()
        i = i - 1
        if i >= 1 then return i, t[i] end
    end
end

for i, v in reverseIter(arr) do
    print(i, v)
end

自定义迭代器返回一个闭包——闭包内部持有遍历状态——每次调用返回下一个元素——状态在闭包里,外部不需要知道遍历的实现细节。

三、四段形态的分界与选择

四种形态的分界线在数据结构:数组用 ipairs、哈希用 pairs、需要底层控制用 next、特殊结构用自定义——数据结构的形状决定遍历形态的选择。和 for 循环的分账写清楚:数字 for 是"我知道起点和终点",泛型 for 是"我不知道有多少个但迭代器知道"——数字 for 需要预先计算遍历次数,泛型 for 由迭代器自己决定何时终止。最后一条纪律:泛型 for 的循环变量也是只读的——在循环体内修改循环变量不会改变遍历进度——和数字 for 的循环变量一样——循环变量是迭代器的输出,不是调用方的输入。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

吞劲奇纹:喂它五拳,它自己噎住

【游戏功能】 上一版藏了条只在长战斗里露头的隐蔽报错:吞劲的计数器跨场不清零——第一场怪喂满了五拳把它噎住,第二场新怪刚出手…

2026-10-01 21:23 996 技术组
进阶实战游戏功能

蚀本血纹:一刀削它两分命,血条越打越短

【游戏功能】 再抛一个坑:血条的长短是天生的吗?一只怪的命根子一千点,打完就满,下回见面还是一千点——命根是它自己的,跟你的…

2026-10-01 21:23 996 技术组
进阶实战游戏功能

顺劈余纹:杀过头的刀,落到下一只头上

【游戏功能】 var over=d-before ——先拆这一行。刀额减去落刀前的血,多出来的那一截就是杀过头的余劲。顺劈纹…

2026-10-01 21:23 996 技术组
进阶实战游戏功能

血注豪纹:押上二十滴血,八秒内定输赢

【游戏功能】 上一轮的线上事故出得难看:有玩家押了二十滴血没在限期内斩掉怪,注被纹收走了,直接在频道里喊"强买强卖"。复盘下…

2026-10-01 21:23 996 技术组
进阶实战游戏功能

偷时快纹:它的刀慢半拍,你的刀快一倍

【游戏功能】 上一版留了个查了半天的隐蔽报错:战斗统计里玩家的出招间隔写着一秒四,实际手感却是一秒整——两套计时账对不上,运…

2026-10-01 21:23 996 技术组
进阶实战游戏功能

存刀神纹:最强一刀存起来,八秒后再砍一遍

【游戏功能】 先抛一个坑:你砍出去的最强一刀,去哪了?暴击三千的天胡刀,数字蹦完就散,下一刀又是从零起算——最强的那一击在战…

2026-10-01 21:23 996 技术组