浅析Lua中的迭代器
Lua迭代器通过函数实现,用于遍历表格等集合元素并返回键值对。根据状态保持方式分为无状态迭代器(依赖传入参数)和有状态迭代器(通常借助闭包),前者示例为计算前n个数平方的square函数。
迭代器本质上是一种结构,让我们能够遍历所谓的集合或容器中的元素。在 Lua 的世界里,这些集合通常就是那些用来构建各种数据结构的表格,比如数组表。

一般对于迭代器
一个通用的迭代器,做的事情很简单:为集合中的每个元素提供键值对。来看一个最直观的例子。
运行这段代码之后,终端会输出:
上面这个例子用的就是 Lua 自带的 ipairs 迭代函数,简单直接。
在 Lua 里,我们用函数来表达迭代器。根据状态保持方式的不同,迭代器可以分成两大类:
- 无状态的迭代器
- 有状态的迭代器(通常借助闭包实现)
无状态的迭代器
光看名字就能猜到,这类迭代器压根不保留任何状态,每次调用时完全靠传入的参数来决定下一步该返回什么。
下面自己动手写一个简单的迭代器——打印前 n 个数的平方。代码长这样:
运行结果:
如果把上面的代码稍微调整一下,让它模仿 ipairs 的那种调用风格(即把迭代器函数、状态初始值和循环变量封装起来),就成了下面这样:
输出结果和之前完全一致:
迭代器状态
刚才的无状态迭代器,每次调用都靠第二个参数来推进。如果想在调用之间保留当前遍历到的位置,就得靠闭包了。闭包能保留不同函数调用之间的变量值,做法是创建两个函数:一个闭包本身,再加上一个工厂函数——工厂负责生成这个闭包。
下面是一个利用闭包实现的自定义迭代器,同样遍历数组:
运行结果:
在这个例子里,elementIterator 用到的外部局部变量 index 和 count 是真正的“闭包状态”。每次调用闭包时,index 都会递增,并返回集合中对应的元素。
实际上,借助闭包我们可以创建更灵活的迭代器,不仅每次能返回一个元素,还能返回多个值,只要在循环中逐一收集就行。上面展示的就是最基础的一种模式。


































