0Pricing
Lua Academy · 课时

泛型 for 协议

理解三值迭代器协议:迭代器函数、状态和控制变量。

泛型 for 协议 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

泛型 for 的工作原理

for 语句会在每次迭代时调用一个迭代器函数。它会传入一个状态和一个控制变量,并在函数返回 nil 时停止。

三个返回值

for var in iter, state, init do —— Lua 会将其解包为:迭代器函数 iter、不变量状态 state 和初始控制变量 init。

ipairs 协议

ipairs(t) 返回一个无状态迭代器函数、作为状态的表,以及值为 0 的初始控制变量。每次调用都会返回下一个索引和值。

for i, v in ipairs({10, 20, 30}) do
  print(i, v)
end

自定义三值迭代器

显式提供全部三个值,即可实现自定义的无状态迭代器。

local function iter(t, i)
  i = i + 1
  local v = t[i]
  if v then return i, v end
end
for i, v in iter, {"a","b","c"}, 0 do
  print(i, v)
end

使用闭包简化

基于闭包的迭代器只需返回迭代器函数(不需要状态或控制变量,因为它们存放在上值中)。

local function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end
for v in values({1,2,3}) do print(v) end

nil 终止循环

泛型 for 循环会在迭代器函数将 nil 作为第一个返回值返回时立即退出。这就是终止约定。

多个返回值

迭代器可以返回多个值;每个值分别对应一个循环变量:for k, v in pairs(t)。

for k, v in pairs({x=1, y=2}) do
  print(k, v)
end

状态参数的使用

状态参数会原样传递给每次迭代器调用。对于无状态迭代器,它包含所需的全部上下文(例如表本身)。

将 Coroutine.wrap 作为迭代器

coroutine.wrap(fn) 返回一个函数,每次调用都会恢复协程;让出的值会成为返回值,因此它非常适合作为泛型 for 迭代器。

local function countdown(n)
  return coroutine.wrap(function()
    for i = n, 1, -1 do coroutine.yield(i) end
  end)
end
for v in countdown(5) do print(v) end

迭代器组合

迭代器可以组合:将一个迭代器包装在另一个迭代器中,以添加过滤或转换功能。

local function mapped(iter, fn)
  return function()
    local v = iter()
    if v ~= nil then return fn(v) end
  end
end

无限迭代器

永不返回 nil 的迭代器会创建无限循环。请始终提供终止条件或使用 break。

local function naturals()
  local n = 0
  return function() n = n+1; return n end
end
for v in naturals() do
  if v > 5 then break end
  print(v)
end

泛型 for 问题

泛型 for 循环何时停止?

回顾:泛型 for 协议

泛型 for 会使用不变的状态和控制变量调用迭代器函数。它在返回 nil 时停止。闭包可以将状态编码在上值中,从而简化有状态迭代器。

常见问题解答

「泛型 for 协议」课时是免费的吗?

是的 — 「泛型 for 协议」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「泛型 for 协议」这节课中我会学到什么?

理解三值迭代器协议:迭代器函数、状态和控制变量。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「泛型 for 协议」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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