迭代器(iterator)是一種對象计露,它能夠用來遍歷標準模板庫容器中的部分或全部元素夺姑,每個迭代器對象代表容器中的確定的地址
在Lua中迭代器是一種支持指針類型的結構锤躁,它可以遍歷集合的每一個元素涯呻。
泛型 for 迭代器
泛型 for 在自己內部保存迭代函數黍翎,實際上它保存三個值:迭代函數面徽、狀態(tài)常量、控制變量匣掸。
泛型 for 迭代器提供了集合的 key/value 對趟紊,語法格式如下:
上面代碼中,k, v為變量列表碰酝;pair(t)為表達式列表霎匈。
查看以下實例:
以上代碼執(zhí)行輸出結果為:
以上實例中我們使用了 Lua 默認提供的迭代函數 ipairs。
下面我們看看范性for的執(zhí)行過程:
首先送爸,初始化铛嘱,計算in后面表達式的值暖释,表達式應該返回范性for需要的三個值:迭代函數、狀態(tài)常量墨吓、控制變量球匕;與多值賦值一樣,如果表達式返回的結果個數不足三個會自動用nil補足帖烘,多出部分會被忽略亮曹。
第二,將狀態(tài)常量和控制變量作為參數調用迭代函數(注意:對于for結構來說蚓让,狀態(tài)常量沒有用處乾忱,僅僅在初始化時獲取他的值并傳遞給迭代函數)。
第三历极,將迭代函數返回的值賦給變量列表窄瘟。
第四,如果返回的第一個值為nil循環(huán)結束趟卸,否則執(zhí)行循環(huán)體蹄葱。
第五,回到第二步再次調用迭代函數
在Lua中我們常常使用函數來描述迭代器锄列,每次調用該函數就返回集合的下一個元素图云。Lua 的迭代器包含以下兩種類型:
無狀態(tài)的迭代器
多狀態(tài)的迭代器
無狀態(tài)的迭代器
無狀態(tài)的迭代器是指不保留任何狀態(tài)的迭代器,因此在循環(huán)中我們可以利用無狀態(tài)迭代器避免創(chuàng)建閉包花費額外的代價邻邮。
每一次迭代竣况,迭代函數都是用兩個變量(狀態(tài)常量和控制變量)的值作為參數被調用,一個無狀態(tài)的迭代器只利用這兩個值可以獲取下一個元素筒严。
這種無狀態(tài)迭代器的典型的簡單的例子是ipairs丹泉,他遍歷數組的每一個元素。
以下實例我們使用了一個簡以上實例輸出結果為:單的函數來實現迭代器鸭蛙,實現 數字 n 的平方:
以上實例輸出結果為:
迭代的狀態(tài)包括被遍歷的表(循環(huán)過程中不會改變的狀態(tài)常量)和當前的索引下標(控制變量)摹恨,ipairs和迭代函數都很簡單,我們在Lua中可以這樣實現:
當Lua調用ipairs(a)開始循環(huán)時娶视,他獲取三個值:迭代函數iter晒哄、狀態(tài)常量a、控制變量初始值0肪获;然后Lua調用iter(a,0)返回1,a[1](除非a[1]=nil)寝凌;第二次迭代調用iter(a,1)返回2,a[2]……直到第一個nil元素。
多狀態(tài)的迭代器
很多情況下孝赫,迭代器需要保存多個狀態(tài)信息而不是簡單的狀態(tài)常量和控制變量硫兰,最簡單的方法是使用閉包,還有一種方法就是將所有的狀態(tài)信息封裝到table內寒锚,將table作為迭代器的狀態(tài)常量劫映,因為這種情況下可以將所有的信息存放在table內违孝,所以迭代函數通常不需要第二個參數。
以下實例我們創(chuàng)建了自己的迭代器:
以上實例輸出結果為:
以上實例中我們可以看到泳赋,elementIterator 內使用了閉包函數雌桑,實現計算集合大小并輸出各個元素。
內容來自:runoob.com 菜鳥教程
整理:極動云祖今,寧波家電物聯網云平臺
CONTACT US: http://www.iot-jd.com