Lua中的迭代器淺析
今天學(xué)習(xí)的內(nèi)容還蠻有意思的,讓我興奮了一下~
1.迭代器
什么是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來(lái)遍歷集合的一種方式。
比如,我們最常用的pairs,如下代碼:
local t = {"fdsd", "445"};
for k, v in pairs(t) do
print("k=" .. k .. ", v=" .. v);
end
這是一次遍歷table的操作,然后打印出table的key值和value值。
輸出結(jié)果如下:
[LUA-print] k=1, v=fdsd
[LUA-print] k=2, v=445
2.自己寫一個(gè)迭代器
要想了解迭代器,那還是要自己寫一個(gè)才行,迭代器沒(méi)有什么神奇的地方,它很簡(jiǎn)單。如這樣一個(gè)函數(shù):
function dieDaiQi(t)
local i = 0;
return function()
i = i + 1;
return t[i];
end
end
這函數(shù)故名思議,叫做迭代器,英文不好的也沒(méi)關(guān)系,知道是這意思就好了,呵呵(小若:英文你個(gè)頭啊!分明是拼音啊?。?br />
有沒(méi)有發(fā)現(xiàn)這dieDaiQi函數(shù)有點(diǎn)特別?沒(méi)錯(cuò),它就是之前的文章提到過(guò)的“閉合函數(shù)”,正是利用了閉合函數(shù)的特性來(lái)實(shí)現(xiàn)迭代功能的。
來(lái)看看如何使用這個(gè)迭代器吧:
local iter = dieDaiQi(t);
while true do
local value = iter();
if value == nil then
break;
end
print(value);
end
因?yàn)槊恳淮握{(diào)用dieDaiQi函數(shù),就會(huì)產(chǎn)生一個(gè)新的閉合函數(shù),所以我們要用一個(gè)iter變量保存這個(gè)閉合函數(shù),避免重復(fù)創(chuàng)建。
如果你對(duì)閉合函數(shù)已經(jīng)很生疏了,可以看看我之前的這篇文章:【笨木頭Lua專欄】基礎(chǔ)補(bǔ)充03:閉合函數(shù)、非全局函數(shù)與函數(shù)的尾調(diào)用
接著,只要循環(huán)調(diào)用iter閉合函數(shù)即可,因?yàn)殚]合函數(shù)的特點(diǎn),i變量是會(huì)一直增加的,所以每次調(diào)用iter函數(shù),返回的都是下一個(gè)table元素。
最終輸出結(jié)果如下:
[LUA-print] fdsd
[LUA-print] 445
3.更簡(jiǎn)潔的迭代器調(diào)用
剛剛調(diào)用迭代器的方式也太粗暴了,這么長(zhǎng)一片代碼,不太合理。
所以,我們又有了偷懶的方式——使用for循環(huán)調(diào)用迭代器。
直接看代碼,剛剛的迭代器可以這么調(diào)用:
local t = {"fdsd", "445"};
for value in dieDaiQi(t) do
print(value);
end
這里大家可能會(huì)有一個(gè)疑問(wèn),每一次的循環(huán),都會(huì)調(diào)用一次dieDaiQi函數(shù),那不就會(huì)產(chǎn)生很多個(gè)閉合函數(shù)?那i的值不就每次都是0?
答案是:不會(huì)的。
因?yàn)閒or循環(huán)只會(huì)調(diào)用一次dieDaiQi函數(shù),然后把它的返回值保存起來(lái)。
4.結(jié)束
這篇的介紹似乎是異常地簡(jiǎn)短,其實(shí)不是的,還有下篇,因?yàn)槲遗陆酉聛?lái)要說(shuō)的東西比較多,導(dǎo)致文章太長(zhǎng)。
所以,還是分開(kāi)來(lái)介紹吧,下一篇,我們來(lái)深入了解一下為什么for循環(huán)可以這么方便地處理迭代器。
相關(guān)文章
Lua面向?qū)ο缶幊讨惖暮?jiǎn)單實(shí)現(xiàn)方式
這篇文章主要介紹了Lua面向?qū)ο缶幊讨惖暮?jiǎn)單實(shí)現(xiàn)方式,本文直接給出一個(gè)類的編碼實(shí)例,并詳細(xì)講解了調(diào)用方式,需要的朋友可以參考下2015-04-04

Lua math.fmod使用時(shí)的小數(shù)問(wèn)題

lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案