(轉載)【笨木頭Lua專欄】基礎補充04:迭代器初探

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

 

 

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

轉載請註明,原文地址: http://www.benmutou.com/archives/1714spa

文章來源:笨木頭與遊戲開發code

 

 

1.迭代器

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

好比,咱們最經常使用的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

 

2.本身寫一個迭代器

要想了解迭代器,那仍是要本身寫一個才行,迭代器沒有什麼神奇的地方,它很簡單。如這樣一個函數: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

 

3.更簡潔的迭代器調用

剛剛調用迭代器的方式也太粗暴了,這麼長一片代碼,不太合理。

因此,咱們又有了偷懶的方式——使用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函數,而後把它的返回值保存起來。

 

4.結束

這篇的介紹彷佛是異常地簡短,其實不是的,還有下篇,由於我怕接下來要說的東西比較多,致使文章太長。

因此,仍是分開來介紹吧,下一篇,咱們來深刻了解一下爲何for循環能夠這麼方便地處理迭代器。

 

 

原文地址:http://www.benmutou.com/archives/1714

相關文章
相關標籤/搜索