https://www.jb51.net/article/86840.htm
泛型for基本格式
流程
- 首先,初始化,计算 in 后面表达式的值,表达式应该返回 泛型for 需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用nil 补足,多出部分会被忽略。
- 第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)
- 第三,将迭代函数返回的值赋给变量列表。
- 第四,如果返回的第一个值为 nil 循环结束,否则执行循环体。
- 第五,回到第二步再次调用迭代函数。
闭包实现ipairs
迭代器是一种可以遍历集合中所有元素的机制,在Lua中通常将迭代器表示为函数,每调用一次函数,就返回集合中“下一个”元素,直到nil结束。
迭代器本身不会接着迭代,要while,for来控制迭代
代码分析:
- for第一次调用myipairs(t),生成了3个变量,迭代器iter,状态常量s,控制变量0
- 在for的驱动下进行迭代,第一次传入 iter(s,0),返回值给到输出列表i,v
- 闭包的作用下i是upvalue,下次传入 iter(s,1)
- 持续第3步,传出nil结束for循环
闭包性能问题
闭包会造成变量在内存中持久占用,因此会有一定的性能问题,最好不要轻易使用,即便使用也要在恰当的实际进行释放