迭代器与泛型 for 2 无状态的迭代器
- 自身不保存任何状态的迭代器
- 可以在多个循环中适用同一个无状态的迭代器,避免创建新的
closure
开销 - 在每次迭代中,
for
循环都会用恒定状态和控制变量来调用迭代器函数 - 一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
endlocal function iter (a, i)
i = i + 1
if v then
return i, v
-- 1, [a1]
-- 2, a[2]
-- n, a[n] = nil
end
endfunction 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
--[[
1one
2two
3three
4four
]]
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的键
endfunction k, v in next, t do
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
endfunction traverse(list)
return getnext, list, nil
endlist = nil
for line in io.lines() do
list = {next = list, value = https://www.it610.com/article/line}
endfor node in traverse(list) do
print(node.value)
end
【lua|lua学习之迭代器与泛型 for 第二篇】
本篇文章由一文多发平台ArtiPub自动发布
推荐阅读
- #|Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
- 学习笔记|【这可能不只是一篇面经】- 有话想说的四个月
- 学习笔记-李宏毅GAN(生成对抗网络)全系列
- 学习笔记|学习笔记 Graph Neural Network (李宏毅 机器学习)
- 手游开发|Xlua hotfix C#案例
- lua|Lua01 基本语法+数据类型+流程控制+运算符
- 关于Java线程,你必须掌握的知识点
- 学习笔记|OpenCV(五)停车场的车位识别
- javascript|2015第40周二Node学习