HoRain云--Lua迭代器全解析

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

Lua 的迭代器(Iterator)本质上是一个能够记住状态的工厂函数,配合 for ... in ...语法完成遍历。下面从原理 → 分类 → 示例 → 常见坑系统讲解。
一、迭代器是什么?
迭代器 = 一个返回“下一个值”的函数
在 Lua 中,迭代器通常是一个闭包函数,每次调用就返回集合中的下一个元素。
for var1, var2 in iterator_func, state, control_var do
-- body
end
二、最简单的迭代器示例
手动实现一个计数器
function counter(n)
local i = 0
return function()
i = i + 1
if i <= n then
return i
end
end
end
for v in counter(3) do
print(v)
end
-- 输出:1 2 3
✅ 核心点:
-
counter返回一个函数 -
该函数保存了
i的状态(闭包)
三、泛型 for 的完整工作机制
for var1, var2 in explist do
block
end
等价于:
do
local _f, _s, _var = explist
while true do
local var1, var2 = _f(_s, _var)
if var1 == nil then break end
_var = var1
block
end
end
|
成分 |
含义 |
|---|---|
|
|
迭代函数 |
|
|
不变状态(state) |
|
|
控制变量 |
四、Lua 内置迭代器
1️⃣ ipairs(数组型)
for i, v in ipairs({"a", "b", "c"}) do
print(i, v)
end
特点:
-
只遍历 1 → n
-
遇到
nil停止 -
有状态但行为固定
2️⃣ pairs(哈希型)
for k, v in pairs({a=1, b=2}) do
print(k, v)
end
特点:
-
遍历所有键值
-
顺序不保证
-
底层使用
next
五、无状态迭代器(推荐)
不使用闭包保存状态,而是靠参数传递
示例:自己实现 ipairs
local function iter(t, i)
i = i + 1
local v = t[i]
if v then
return i, v
end
end
function my_ipairs(t)
return iter, t, 0
end
✅ 优点:
-
无额外闭包
-
性能更好
-
适合简单遍历
六、有状态迭代器(闭包)
function all_numbers()
local i = 0
return function()
i = i + 1
return i
end
end
✅ 适合:
-
复杂逻辑
-
多状态
-
外部依赖
❌ 缺点:
-
创建闭包成本略高
七、多返回值迭代器
function zip(a, b)
local i = 0
return function()
i = i + 1
return a[i], b[i]
end
end
for x, y in zip({1,2}, {"a","b"}) do
print(x, y)
end
八、迭代器 + 协程(高级)
function producer()
return coroutine.wrap(function()
for i = 1, 3 do
coroutine.yield(i)
end
end)
end
for v in producer() do
print(v)
end
✅ 常用于:
-
流式数据
-
延迟计算
-
复杂生成器
九、常见坑 ⚠️
❌ 在迭代中修改 table
for k in pairs(t) do
t[k] = nil -- 不安全
end
✅ 正确做法:
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
for _, k in ipairs(keys) do
t[k] = nil
end
十、什么时候用哪种?
|
场景 |
推荐方式 |
|---|---|
|
简单数组 |
|
|
全表遍历 |
|
|
高性能 |
无状态迭代器 |
|
复杂逻辑 |
闭包迭代器 |
|
流式数据 |
协程迭代器 |
如果你愿意,我可以:
-
✅ 手写一个 仿 Python 的 range 迭代器
-
✅ 对比 Lua / Python / C++ 迭代器差异
-
✅ 讲 LuaJIT 下的迭代器性能优化
你想继续深入哪一块? 😊
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐


所有评论(0)