今天學習的內容還蠻有意思的,讓我興奮了一下~
1.迭代器
什么是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。
比如,我們最常用的pairs,如下代碼:
復制代碼 代碼如下:
local t = {"fdsd", "445"};
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
2.自己寫一個迭代器
要想了解迭代器,那還是要自己寫一個才行,迭代器沒有什么神奇的地方,它很簡單。如這樣一個函數:
復制代碼 代碼如下:
function dieDaiQi(t)
local i = 0;
return function()
i = i + 1;
return t[i];
end
end
這函數故名思議,叫做迭代器,英文不好的也沒關系,知道是這意思就好了,呵呵(小若:英文你個頭啊!分明是拼音?。。?br />
有沒有發現這dieDaiQi函數有點特別?沒錯,它就是之前的文章提到過的“閉合函數”,正是利用了閉合函數的特性來實現迭代功能的。
來看看如何使用這個迭代器吧:
復制代碼 代碼如下:
local iter = dieDaiQi(t);
while true do
local value = iter();
if value == nil then
break;
end
print(value);
end
因為每一次調用dieDaiQi函數,就會產生一個新的閉合函數,所以我們要用一個iter變量保存這個閉合函數,避免重復創建。
如果你對閉合函數已經很生疏了,可以看看我之前的這篇文章:【笨木頭Lua專欄】基礎補充03:閉合函數、非全局函數與函數的尾調用
接著,只要循環調用iter閉合函數即可,因為閉合函數的特點,i變量是會一直增加的,所以每次調用iter函數,返回的都是下一個table元素。
最終輸出結果如下:
復制代碼 代碼如下:
[LUA-print] fdsd
[LUA-print] 445
3.更簡潔的迭代器調用
剛剛調用迭代器的方式也太粗暴了,這么長一片代碼,不太合理。
所以,我們又有了偷懶的方式——使用for循環調用迭代器。
直接看代碼,剛剛的迭代器可以這么調用:
復制代碼 代碼如下:
local t = {"fdsd", "445"};
for value in dieDaiQi(t) do
print(value);
end
這里大家可能會有一個疑問,每一次的循環,都會調用一次dieDaiQi函數,那不就會產生很多個閉合函數?那i的值不就每次都是0?
答案是:不會的。
因為for循環只會調用一次dieDaiQi函數,然后把它的返回值保存起來。
4.結束
這篇的介紹似乎是異常地簡短,其實不是的,還有下篇,因為我怕接下來要說的東西比較多,導致文章太長。
所以,還是分開來介紹吧,下一篇,我們來深入了解一下為什么for循環可以這么方便地處理迭代器。
您可能感興趣的文章:- 深入解讀Lua中迭代器與泛型for的使用
- 淺析Lua中的迭代器
- Lua教程(五):迭代器和泛型for
- Lua中的迭代器和泛型for介紹
- Lua中的迭代器和泛型for學習總結
- Lua中的迭代器和泛型for實例
- Lua中的迭代器(iterator)淺析
- Lua的迭代器使用中應該避免的問題和技巧
- Lua中的for循環和迭代器的秘密探究
- Lua基礎迭代器的使用實例