今天學習的內容還蠻有意思的,讓我興奮了一下~
笨木頭花心貢獻,哈?花心?不,是用心~
什麼是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。
比方,我們最經常使用的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個人左右。很熱鬧,但,似乎我們團隊並沒有這個能力去消化這份力量。後來,...