lua中的迭代器分析

2021-08-02 02:20:01 字數 997 閱讀 5207



1. 所謂"迭代器",就是一種可以遍歷某個集合中所有元素的機制,在lua中迭代器通常表示為函式,而具體的實現有很多種。

整個迭代的過程基本如下:

首先是通過迭代器工廠建立迭代器;

然後每次呼叫這個迭代器時,它就會從指定的集合中返回下乙個元素;

直到最後乙個元素返回後,迭代器就會返回nil,以此表示迭代結束。

2. 閉包是一種最典型的迭代器函式,因為閉包中的"非區域性的變數"可以用來在每次呼叫之間保持一些狀態,從而使閉包可以記住每次迭代所在的位置。

3. lua中的泛型for天然就是為迭代而設計的,其語法格式如下:

for in do

end備註:是變數名列表,用來儲存迭代器函式的返回值,其中的第乙個變數固定稱為"控制變數",當它為nil時迭代結束;

是表示式列表,通常只有乙個,即對迭代器工廠的呼叫。

泛型for的執行流程如下:

[1]. 對關鍵字"in"後面的表示式求值,該表示式通常會返回3個值供for儲存,迭代器函式、恆定狀態、控制變數的初值

[2]. 將恆定狀態(比如要遍歷的table)和控制變數作為實參,呼叫迭代器函式

[3]. 將迭代器函式的返回值賦給變數列表,如果控制變數為nil,則迭代結束

[4]. 如果控制變數是有效值,則執行迴圈體,隨後再次呼叫迭代器函式,執行下一次迭代

4. 泛型for中的迭代器函式可以是一種自身不儲存任何狀態的普通函式,又叫做"無狀態迭代器",每次迭代都是根據恆定狀態和控制變數來遍歷每個元素。

這種"無狀態迭代器"的優點顯而易見,它將狀態儲存在泛型for中,不需要建立任何新的物件,所以盡可能嘗試編寫這種迭代器。

5. 泛型for中的迭代器函式也可以是閉包,這通常意味著迭代器需要儲存很多狀態,而泛型for只提供了乙個恆定狀態和乙個控制變數用於狀態的儲存,使用閉包可以優雅的解決這個問題。

6. 有複雜狀態的迭代器除了可以通過閉包實現,還可以將這些複雜狀態全部打包為乙個table,儲存在恆定狀態中,這也意味著迭代器不再需要泛型for提供的控制變數了。

Lua中的迭代器

1 lua標準庫中提供了4種常用的迭代器 1 用於迭代檔案中每行的io.lines 2 迭代字串中單詞的string.gmatch 3 迭代table元素的pairs 4 迭代陣列元素的iparis 相對於數字型for迴圈,後兩者又稱為泛型for迴圈 2 pairs與ipairs paris遍歷ta...

Lua中迭代器的使用技巧

迭代器的使用技巧 使用排序好的key迭代 你曾有過這樣的需求麼 fork,v inpairs t do 按照排序的key來遍歷表.function sortedpairs t,comparator local sortedkeys table.foreach t,function k,v table...

Lua迭代器的實現

lua迭代器才有放回個函式的方法,for in的結構會迴圈呼叫該函式,直到第乙個放回值為nil時,就會終止迴圈。其中迭代器中的函式會利用upvalue的概念,如下面 變數i就是放回函式的upvalue,返回函式體中不斷的對i變數做 1處理,i的值就是從0,1,2,3不斷的往上加的。local ite...