lua学习笔记day04-----无状态和多状态的迭代器

在解释无状态和多状态的迭代器之前,我们需要先了解一下泛型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内带入迭代函数。



你可能感兴趣的:(lua)