泛型 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) endnil 终止循环
泛型 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 反馈 — 无需本地设置。
此课程中的所有课时
- 泛型 for 协议
- 无状态迭代器
- 使用闭包实现有状态迭代器
- 基于协程的生成器