LUA 迭代器与泛型for
闭包函数创建迭代器
do t = {22,33,44,55,66,} -- 待遍历的集合 for k, v in ipairs (t) do -- 使用ipairs遍历 print (k, v) end function tableV (t) -- 创建一个迭代器 local i=0 -- 闭包计数器 return function () i=i+1 return t[i] end -- 闭包函数,返回形参t表索引i的值 end for v in tableV (t) do -- 测试迭代器 print (v) end end --[[
ipairs输出 tableV输出 1 22 22 2 33 33 3 44 44 4 55 55 5 66 66
--]]
每一次调用闭包函数都可以持续更新其保存的状态,使用这种特性就可以创建迭代器。
闭包:就是一个可以访问其自身环境中一个或多个局部变量的函数。
迭代器:是一种可以遍历一个集合中所有元素的代码结构,通常是一个函数。每次调用该函数时会返回集合中的下一个元素。
泛型for的语法
for var-list in exp-list do
body
end
var-list:变量列表
exp-list:表达式列表,通常是一个迭代函数的调用,一个不可变受保护的数据,一个控制变量。
泛型for表达式列表中的三个值,即:迭代函数、受保护数据、控制变量。 他们要么在表达式中返回,要么在表达式列表中。在循环之前进行隐式多重赋值。
详解泛型for
do local t = {22,33,44,55,66,77,88} function tableV (t) -- 创建一个迭代器 local i=0 -- 闭包计数器 return function () i=i+1 return t[i] end -- 返回了一个匿名函数的地址,这个匿名函数返回迭代后的键。 end -- 分解泛型for local _f, _s, _var = tableV (t) -- 多重赋值,_f:迭代函数,_s:受保护数据,_var:控制变量。_f引用了tableV(t)返回的匿名函数 while true do -- 泛型for希望一个迭代器函数能够返为他反回三个值,_f, _s, _var。这样才能在迭代中使用闭包进行计数器叠加,不破坏被迭代的数据,判断迭代结束。 local k = _f(_s, _var) -- 用受保护数据和控制变量作为参数调用迭代函数并与变量列表进行多重赋值,根据函数原型,k赋值肯定是每次迭代最新的t[i]键 _var = k -- 将控制变量赋值 if _var == nil then break end -- 检查控制变量,如果为nil则退出循环完成迭代。 print (_var) end end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现