今天學習的內容還蠻有意思的,讓我興奮了一下~函數
笨木頭花心貢獻,哈?花心?不,是用心~學習
轉載請註明,原文地址: http://www.benmutou.com/archives/1714spa
文章來源:笨木頭與遊戲開發code
什麼是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。遊戲
好比,咱們最經常使用的pairs,以下代碼:ci
1
2 3 4 5 |
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=445get
要想了解迭代器,那仍是要本身寫一個才行,迭代器沒有什麼神奇的地方,它很簡單。如這樣一個函數:it
1
2 3 4 5 6 7 |
function dieDaiQi(t)
local i = 0; return function() i = i + 1; return t[i]; end end |
這函數故名思議,叫作迭代器,英文很差的也不要緊,知道是這意思就行了,呵呵(小若:英文你個頭啊!分明是拼音啊!)
有沒有發現這dieDaiQi函數有點特別?沒錯,它就是以前的文章提到過的「閉合函數」,正是利用了閉合函數的特性來實現迭代功能的。
來看看如何使用這個迭代器吧:
1
2 3 4 5 6 7 8 9 |
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
剛剛調用迭代器的方式也太粗暴了,這麼長一片代碼,不太合理。
因此,咱們又有了偷懶的方式——使用for循環調用迭代器。
直接看代碼,剛剛的迭代器能夠這麼調用:
1
2 3 4 5 6 |
local t = {"fdsd", "445"};
for value in dieDaiQi(t) do print(value); end |
這裏你們可能會有一個疑問,每一次的循環,都會調用一次dieDaiQi函數,那不就會產生不少個閉合函數?那i的值不就每次都是0?
答案是:不會的。
由於for循環只會調用一次dieDaiQi函數,而後把它的返回值保存起來。
這篇的介紹彷佛是異常地簡短,其實不是的,還有下篇,由於我怕接下來要說的東西比較多,致使文章太長。
因此,仍是分開來介紹吧,下一篇,咱們來深刻了解一下爲何for循環能夠這麼方便地處理迭代器。
原文地址:http://www.benmutou.com/archives/1714