🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

一、迭代器是什么?

二、最简单的迭代器示例

手动实现一个计数器

三、泛型 for 的完整工作机制

四、Lua 内置迭代器

1️⃣ ipairs(数组型)

2️⃣ pairs(哈希型)

五、无状态迭代器(推荐)

示例:自己实现 ipairs

六、有状态迭代器(闭包)

七、多返回值迭代器

八、迭代器 + 协程(高级)

九、常见坑 ⚠️

❌ 在迭代中修改 table

十、什么时候用哪种?


img

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

成分

含义

_f

迭代函数

_s

不变状态(state)

_var

控制变量


四、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

十、什么时候用哪种?

场景

推荐方式

简单数组

ipairs

全表遍历

pairs

高性能

无状态迭代器

复杂逻辑

闭包迭代器

流式数据

协程迭代器


如果你愿意,我可以:

  • ✅ 手写一个 仿 Python 的 range 迭代器

  • ✅ 对比 Lua / Python / C++ 迭代器差异

  • ✅ 讲 LuaJIT 下的迭代器性能优化

你想继续深入哪一块? 😊

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐