Lua:泛型for,迭代器,闭包实现ipairs(转)
https://www.jb51.net/article/86840.htm
泛型for基本格式
for <var-list> in <exp-list> do <body> end
流程
- 首先,初始化,计算 in 后面表达式的值,表达式应该返回 泛型for 需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用nil 补足,多出部分会被忽略。
- 第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)
- 第三,将迭代函数返回的值赋给变量列表。
- 第四,如果返回的第一个值为 nil 循环结束,否则执行循环体。
- 第五,回到第二步再次调用迭代函数。
闭包实现ipairs
迭代器是一种可以遍历集合中所有元素的机制,在Lua中通常将迭代器表示为函数,每调用一次函数,就返回集合中“下一个”元素,直到nil结束。
迭代器本身不会接着迭代,要while,for来控制迭代
function values(t) local i = 0 return function() i = i + 1; return t[i] end end t = {10, 20, 30} print("循环调用---------------") iter = values(t) while true do local el = iter() if el == nil then break end print(el) end print("泛型for调用---------------") for el in values(t) do print(el) end print("ipair实现原理---------------") local function iter(s, i) i = i + 1 local v = s[i] if v then return i, v end end function myipairs(s) return iter, s, 0 end for i,v in myipairs(t) do print(i) print(v) end
代码分析:
- for第一次调用myipairs(t),生成了3个变量,迭代器iter,状态常量s,控制变量0
- 在for的驱动下进行迭代,第一次传入 iter(s,0),返回值给到输出列表i,v
- 闭包的作用下i是upvalue,下次传入 iter(s,1)
- 持续第3步,传出nil结束for循环
闭包性能问题
https://www.cnblogs.com/unityzc/p/10317129.html
闭包会造成变量在内存中持久占用,因此会有一定的性能问题,最好不要轻易使用,即便使用也要在恰当的实际进行释放
posted on 2022-03-09 18:45 luoyikun 阅读(14) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现