lua學習筆記day04-----無狀態和多狀態的迭代器
阿新 • • 發佈:2019-02-09
在解釋無狀態和多狀態的迭代器之前,我們需要先了解一下泛型for是如何和迭代函式一起工作的。
在上述程式中,gc函式是一個建立迭代函式的函式。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的語義裡指出,
1、程式會先計算in後面的表示式。
2、表示式返回迭代函式,狀態引數,控制變數三個引數。(有可能返回的不足三個,按照多值賦值的原理來)
3、for會保留這三個引數,並把返回的狀態引數和控制變數帶入到迭代函式中去計算。(迭代函式的形參個數可能和返回的不一致,按照多值賦值)
4、迭代函式計算的結果會返回到in之前的引數列表裡。(有可能返回的值的個數和in之前的引數個數不同,按照多值賦值來)
5、引數列表的第一個值,不為nil,就執行for的程式碼塊
6、程式碼塊結束後再次呼叫迭代函式,等待下一個返回值。直到返回nil
這個過程是比較好理解的,分兩步,第一步生成並初始化迭代函式,第二步,開始迭代。
那麼什麼叫做無狀態的迭代器,和有狀態的迭代器呢?
目前我只能從格式上去區分,還沒有理解到位。
無狀態的迭代器中,迭代器函式有兩個形參, 分別用於接受狀態常量和控制變數。
只用這兩個值,能計算出下一個元素的值的,叫做無狀態迭代器。
有狀態的迭代器,形式上分為兩種,
一種迭代函式沒有形參,是由閉包的形式實現。
另一種,有一個table類的形參,可以把所有的引數都放在一個table內帶入迭代函式。