无状态迭代器
编写类似 ipairs 的无状态迭代器,并实现自定义变体。
无状态迭代器 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
什么是无状态迭代器
无状态迭代器不携带内部状态。所有信息都会在每次调用时作为参数传入:不变的状态和当前控制变量。
ipairs:典型示例
ipairs 是无状态的——它使用表作为状态,并使用当前索引作为控制变量。
local function myIpairs(t, i)
i = i + 1
local v = t[i]
if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 dosquares 迭代器
一种返回连续平方数的无状态迭代器。状态保存上限,控制变量是当前数字。
local function squaresIter(max, n)
n = n + 1
if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
print(n, sq)
end无需闭包
无状态迭代器无需分配闭包。由于所有状态都通过参数传递,每次迭代都不会产生堆分配。
实现类似 pairs 的迭代器
使用 next 作为迭代器函数的无状态键值迭代器——这正是 pairs 的工作方式。
for k, v in next, {a=1, b=2} do
print(k, v)
endnext 函数
next(t, k) 返回键 k 之后的下一个键值对。传入 nil(或省略参数)即可从开头开始。
local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)自定义范围迭代器
带步长的无状态范围迭代器。状态保存配置表,控制变量是当前值。
local function rangeIter(state, n)
n = n + state.step
if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
print(v)
end性能优势
无状态迭代器非常适合紧凑循环。每次调用都不会创建闭包,因此在简单遍历中,它们比有状态的闭包迭代器更快。
局限性
当迭代需要复杂状态(多个计数器、队列或动态数据)时,无状态迭代器会变得不便。此时请改用有状态的闭包迭代器或协程。
与 table.move 结合
无状态切片迭代器会返回表切片中的元素。不变状态保存数组和结束索引,控制变量是当前索引。
标准库中的无状态迭代器
ipairs、pairs(通过 next)和 string.gmatch 在内部都使用无状态或近似无状态的设计。
无状态迭代器问题
是什么让迭代器成为无状态迭代器?
回顾:无状态迭代器
无状态迭代器通过参数接收全部上下文,无需分配闭包,并且性能很高。它们非常适合数组索引等简单的顺序遍历。
用 AI 导师学习 Lua — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 40
- 课程
- 159
常见问题解答
「无状态迭代器」课时是免费的吗?
是的 — 「无状态迭代器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「无状态迭代器」这节课中我会学到什么?
编写类似 ipairs 的无状态迭代器,并实现自定义变体。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「无状态迭代器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。