迭代器是一种指针类型的结构,它可以遍历集合的每一个元素。在lua中我们常常用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。
从原文对迭代器的描述来看,迭代器应该包含两个部分:
1、迭代过程的描述,这个是由函数完成
2、每次调用,显然是一个循环的结构,既然是个循环结构,且没有特指泛型for,就表明,用其他循环语句也是可以完成迭代器。
那么迭代器,泛型for就是两个东西。
迭代器可以不由泛型for和闭包组成。
高效的迭代器可以由泛型for和闭包来实现。
首先,我创建一个使用while循环且不带闭包的迭代器,不建议使用这样的迭代器,创建麻烦。
a = {"one","two","three"}
n = 3
i = 0
function dd(c,k)
if k <= n then
k = k + 1
return c[k],k
end
return nil
end
function gc()
return dd
end
do
p = gc()
while true do
b ,i= p(a,i)
if b then
print(b)
else break end
end
end
上述代码,用gc返回一个dd的迭代函数给p。这样p就是一个迭代函数,通过while循环实现对a集合的遍历。
这while和p就组成了一个迭代器。
在这个例子里,没有用到泛型for和闭包,这个例子仅仅为了解释迭代、泛型for和闭包,不是存在必要的联系。
现在将闭包的思想加入到上述的例子中,
闭包是可以记录upvalue(外部的局部变量)的状态的。
a = {"one","two","three"}
function gc(c)
local k = 0
return function ()
k = k + 1
if c[k] then
return c[k],k
end
return nil
end
end
do
p = gc(a)
while true do
b = p()
if b then
print(b)
else break end
end
end
通过闭包的思想,可以将多余的全局变量省去。省去一个函数名。
现在再将泛型for加入到上述例子中
a = {"one","two","three"}
function gc(c)
local k = 0
return function ()
k = k + 1
if c[k] then
return c[k],k
end
return nil
end
end
for b in gc(a) do
print(b)
end
循环的过程被泛型for替代,让整个过程看起来非常的简单。
这就是闭包和泛型for组合生成的高效迭代器。