迭代器的概念
百度百科:
迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。
个人理解:
遍历容器的方法
常用迭代器
for + ipairs 迭代
lua内置的ipairs()适用于普通连续的表,并且索引是从1开始连续数字,否者就会出现下面代码一样的情况
-- for循环 ipairs迭代器,pairs迭代器
a = {
"A", "B", [0] = "C", [-1] = "D", [5] = "E"}
for i, v in ipairs(a) do-- > ipairs 不能搞定小于1的以及不连续的索引
print("ipairs:", i, v)
end
输出结果:只读出来索引1,2的内容
for + pairs 迭代
Lua内置pairs()可以用于复杂的表
a = {
"A", "B", [0] = "C", [-1] = "D", [5] = "E",["U"] = 6}
for i, v in pairs(a) do
print("pairs:", i, v)
end
输出结果:我们可以看到不管索引是什么都会被提出来
迭代器分类
无状态迭代器
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素,元素的索引需要是数值。
个人理解无状态迭代器:
1、需要传入两个参数(状态常量,控制变量)
2、迭代器内逻辑返回值不是 function
-- 无状态迭代器
function square(i, c)
if c < i then
c = c + 1
return c, c * c -- >返回值对应下方 i,n
end
end
for i, n in square, 3, 0 do
print(i, n)
end
输出结果:
多状态的迭代器
很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到table 内,将 table 作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在 table 内,所以迭代函数通常不需要第二个参数。
【闭包】:内部函数调用外部函数的变量函数要有出口 即 return
个人理解多状态迭代器:
1、通常形参为一个table
2、通过闭包进行内容读取
array = {
"AAA", "BBB","CCC"}
function elementIterator(collection)
local index = 0
local count = #collection
-- 闭包函数
return function() --> 返回值
index = index + 1
if index <= count then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array) do
print(element)
end
输出结果:
END
如有错误欢迎指出!
参考内容:https://www.runoob.com/lua/lua-iterators.html
参考内容:https://baike.baidu.com/item/%E8%BF%AD%E4%BB%A3%E5%99%A8/3803342?fr=aladdin