笨木頭Lua專欄 基礎補充04 迭代器初探

2021-06-26 11:47:15 字數 1609 閱讀 6764

今天學習的內容還蠻有意思的,讓我興奮了一下~

笨木頭花心貢獻,哈?花心?不,是用心~

什麼是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。

比如,我們最常用的pairs,如下**:

local t = ;

for k, v in pairs(t) do

print("k=" .. k .. ", v=" .. v);

end

這是一次遍歷

table的操作,然後列印

出table的key值和value值。

輸出結果如下:

[lua-print] k=1, v=fdsd

[lua-print] k=2, v=445

function diedaiqi(t)

local i = 0;

return function()

i = i + 1;            

return t[i];

endend

這函式

故名思議,叫做迭代器,英文不好的也沒關係,知道是這意思就好了,呵呵(小若:英文你個頭啊!分明是拼音啊!)

有沒有發現這diedaiqi函式有點特別?沒錯,它就是之前的文章提到過的「閉合函式」,正是利用了閉合函式的特性來實現迭代功能的。

來看看如何使用這個迭代器吧:

local iter = diedaiqi(t);

while true do

local value = iter();

if value == nil then

break;

endprint(value);

end

因為每一次呼叫diedaiqi函式,就會產生乙個新的閉合函式,所以我們要用乙個iter變數儲存這個閉合函式,避免重複建立。

如果你對閉合函式已經很生疏了,可以看看我之前的這篇文章:【笨木頭lua專欄】基礎補充03:閉合函式、非全域性函式與函式的尾呼叫

接著,只要迴圈呼叫iter閉合函式即可,因為閉合函式的特點,i變數是會一直增加的,所以每次呼叫iter函式,返回的都是下乙個table元素。

最終輸出結果如下:

[lua-print] fdsd

[lua-print] 445

剛剛呼叫迭代器的方式也太粗暴了,這麼長一片**,不太合理。

所以,我們又有了偷懶的方式——使用for迴圈呼叫迭代器。

直接看**,剛剛的迭代器可以這麼呼叫:

local t = ;

for value in diedaiqi(t) do

print(value);

end

這裡大家可能會有乙個疑問,每一次的迴圈,都會呼叫一次diedaiqi函式,那不就會產生很多個閉合函式?那i的值不就每次都是0?

答案是:不會的。

因為for迴圈只會呼叫一次diedaiqi函式

,然後把它的返回值儲存起來。

這篇的介紹似乎是異常地簡短,其實不是的,還有下篇,因為我怕接下來要說的東西比較多,導致文章太長。

笨木頭Lua專欄 基礎補充04 迭代器初探

今天學習的內容還蠻有意思的,讓我興奮了一下 笨木頭花心貢獻,哈?花心?不,是用心 什麼是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。比方,我們最經常使用的pairs,例如以下 local t for k,v in pairs t do print k k v v end...

笨木頭Lua專欄 基礎補充07 協同程式初探

哎。周五晚上我都還這麼努力看書。真是好孩子。小若 不想吐槽了 事實上我都準備玩遊戲 看電影去的了。可是這書就擺在桌子 上。並且正對著我,就想著。掃兩眼吧。結果一掃就不正確勁了,由於這內容有點繞,有點小混亂,假設我如今不記錄下來的話。下周一可能又要又一次看一次了。好吧,今天我們來聊聊協同程式。笨木頭花...

笨木頭「創業」路 No 6 沒落

我是乙個很專情的人。大四我在同乙個公司實習了一年,一年時間裡,我們的專案組走的走,換的換。最終,第一批人員,就剩下我乙個。好吧,難道我是專案組的克星?雖然最終我也走了。而到了這個創業公司,從一開始的5 6個人,到後來的高峰期是10個人左右。很熱鬧,但,似乎我們團隊並沒有這個能力去消化這份力量。後來,...