lua学习之迭代器与泛型 for 第二篇
2020-03-02 14:15
169 查看
迭代器与泛型 for 2
无状态的迭代器
- 自身不保存任何状态的迭代器
- 可以在多个循环中适用同一个无状态的迭代器,避免创建新的
closure
开销 - 在每次迭代中,
for
循环都会用恒定状态和控制变量来调用迭代器函数 - 一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素
a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end local function iter (a, i) i = i + 1 if v then return i, v -- 1, [a1] -- 2, a[2] -- n, a = nil end end function ipairs(a) return iter, a, 0 end -- next 会以 table 中的任意次序返回一组值 -- 返回,此 table 的下一个 key 和 这个 key 所对应的值 -- next(t, nil) 返回 table 的第一组值。若没有下一组值,则返回 nil a = {"one", "two", "three", "four"} for i, v in next, a, nil do print(i, v) end --[[ 1 one 2 two 3 three 4 four ]] print(next(a, nil)) -- 1 one 实际上等同于返回第一组key,value print(next(a, 1)) -- 2 two print(next(a, 2)) -- 3 three print(next(a, 3)) -- 4 four print(next(a, 4)) -- nil 实际上最后一组的下一组即没有任何元素 function pairs(t) return next, t, nil -- next(t, k) t 为 table ,k 为这个table的键 end function k, v in next, t do <loop body> end
遍历链表的无状态迭代器
- 将链表的头结点作为恒定状态即
traverse
返回的第二个值 - 将当前结点作为控制变量
- 第一次调用迭代器函数
getnext
时,node
为nil
- 因此函数返回
list
作为第一个结点 - 在后续调用中
node
不再为nil
时就会返回node.next
了
local function getnext(list, node) -- 迭代器函数 if not node then return list else return node.next end end function traverse(list) return getnext, list, nil end list = nil for line in io.lines() do list = {next = list, value = line} end for node in traverse(list) do print(node.value) end
本篇文章由一文多发平台ArtiPub自动发布 (window.slotbydup = window.slotbydup || []).push({ id: "u5894387", container: "_0hv0l6ey3zro", async: true });
相关文章推荐
- lua学习之迭代器与泛型 for 第三篇
- Lua学习笔记-迭代器和泛型for
- Lua学习笔记(七):迭代器与泛型for
- Lua学习(七)-----迭代器和泛型for
- Lua学习笔记 第七章 迭代器与泛型for
- Lua迭代器与泛型for
- Lua学习笔记之迭代器与范型for
- Java 进阶,学习笔记-8 Collection 集合,迭代器,增强 for,泛型,可变参数的使用以及集合工具类 Collection 的使用
- lua迭代器与泛型for
- lua中的迭代器与泛型for
- Step By Step(Lua迭代器和泛型for)
- Step By Step(Lua迭代器和泛型for)
- lua语言-《lua程序设计》6~7章函数和迭代器与泛型for
- Step By Step(Lua迭代器和泛型for)
- LUA学习笔记--泛型for进行迭代处理的细节
- Lua中的迭代器和泛型for实例
- Lua 迭代器与泛型for
- 深入解读Lua中迭代器与泛型for的使用
- lua中的泛型for 和迭代器
- Lua语言学习(一)------Lua语言闭包代替范性for语义的迭代器的原理