1. 程式人生 > >lua學習筆記day04-----無狀態和多狀態的迭代器

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內帶入迭代函式。