Lua Academy · 课时

无状态迭代器

编写类似 ipairs 的无状态迭代器,并实现自定义变体。

第 2 / 4 课13 个步骤

无状态迭代器 是 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 do

squares 迭代器

一种返回连续平方数的无状态迭代器。状态保存上限,控制变量是当前数字。

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)
end

next 函数

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 泛型 for 协议
  2. 无状态迭代器
  3. 使用闭包实现有状态迭代器
  4. 基于协程的生成器
← 返回 Lua Academy