在解释无状态和多状态的迭代器之前,我们需要先了解一下泛型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
在上述程序中,gc函数是一个创建迭代函数的函数。
泛型for的语义里指出,
1、程序会先计算in后面的表达式。
2、表达式返回迭代函数,状态参数,控制变量三个参数。(有可能返回的不足三个,按照多值赋值的原理来)
3、for会保留这三个参数,并把返回的状态参数和控制变量带入到迭代函数中去计算。(迭代函数的形参个数可能和返回的不一致,按照多值赋值)
4、迭代函数计算的结果会返回到in之前的参数列表里。(有可能返回的值的个数和in之前的参数个数不同,按照多值赋值来)
5、参数列表的第一个值,不为nil,就运行for的代码块
6、代码块结束后再次调用迭代函数,等待下一个返回值。直到返回nil
这个过程是比较好理解的,分两步,第一步生成并初始化迭代函数,第二步,开始迭代。
那么什么叫做无状态的迭代器,和有状态的迭代器呢?
目前我只能从格式上去区分,还没有理解到位。
无状态的迭代器中,迭代器函数有两个形参, 分别用于接受状态常量和控制变量。
只用这两个值,能计算出下一个元素的值的,叫做无状态迭代器。
有状态的迭代器,形式上分为两种,
一种迭代函数没有形参,是由闭包的形式实现。
另一种,有一个table类的形参,可以把所有的参数都放在一个table内带入迭代函数。