最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua中的迭代器淺析

 更新時間:2014年09月13日 10:23:52   作者:笨木頭  
這篇文章主要介紹了Lua中的迭代器淺析,本文先是講解了什么是迭代器,然后給出了自己寫一個迭代器的示例,最后介紹了迭代器的調(diào)用方法,需要的朋友可以參考下

今天學習的內(nèi)容還蠻有意思的,讓我興奮了一下~

1.迭代器

什么是迭代器?別傻了,我最討厭的就是名詞解釋了,反正就是用來遍歷集合的一種方式。
比如,我們最常用的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.自己寫一個迭代器

要想了解迭代器,那還是要自己寫一個才行,迭代器沒有什么神奇的地方,它很簡單。如這樣一個函數(shù):

復制代碼 代碼如下:

function dieDaiQi(t)
    local i = 0;
    return function()
        i = i + 1;           
        return t[i];
    end
end

這函數(shù)故名思議,叫做迭代器,英文不好的也沒關(guān)系,知道是這意思就好了,呵呵(小若:英文你個頭?。》置魇瞧匆舭。。?br />  
有沒有發(fā)現(xiàn)這dieDaiQi函數(shù)有點特別?沒錯,它就是之前的文章提到過的“閉合函數(shù)”,正是利用了閉合函數(shù)的特性來實現(xiàn)迭代功能的。
來看看如何使用這個迭代器吧:

復制代碼 代碼如下:

    local iter = dieDaiQi(t);
    while true do
        local value = iter();
        if value == nil then
            break;
        end
      
        print(value);
    end

因為每一次調(diào)用dieDaiQi函數(shù),就會產(chǎn)生一個新的閉合函數(shù),所以我們要用一個iter變量保存這個閉合函數(shù),避免重復創(chuàng)建。

如果你對閉合函數(shù)已經(jīng)很生疏了,可以看看我之前的這篇文章:【笨木頭Lua專欄】基礎(chǔ)補充03:閉合函數(shù)、非全局函數(shù)與函數(shù)的尾調(diào)用

接著,只要循環(huán)調(diào)用iter閉合函數(shù)即可,因為閉合函數(shù)的特點,i變量是會一直增加的,所以每次調(diào)用iter函數(shù),返回的都是下一個table元素。
最終輸出結(jié)果如下:

復制代碼 代碼如下:

[LUA-print] fdsd
[LUA-print] 445

3.更簡潔的迭代器調(diào)用

剛剛調(diào)用迭代器的方式也太粗暴了,這么長一片代碼,不太合理。
所以,我們又有了偷懶的方式——使用for循環(huán)調(diào)用迭代器。
 
直接看代碼,剛剛的迭代器可以這么調(diào)用:

復制代碼 代碼如下:

    local t = {"fdsd", "445"};
    for value in dieDaiQi(t) do
        print(value);
    end

 
這里大家可能會有一個疑問,每一次的循環(huán),都會調(diào)用一次dieDaiQi函數(shù),那不就會產(chǎn)生很多個閉合函數(shù)?那i的值不就每次都是0?

答案是:不會的。

因為for循環(huán)只會調(diào)用一次dieDaiQi函數(shù),然后把它的返回值保存起來。

4.結(jié)束

這篇的介紹似乎是異常地簡短,其實不是的,還有下篇,因為我怕接下來要說的東西比較多,導致文章太長。

所以,還是分開來介紹吧,下一篇,我們來深入了解一下為什么for循環(huán)可以這么方便地處理迭代器。

相關(guān)文章

  • Lua判斷Table是否為空的方法(空的table即{})

    Lua判斷Table是否為空的方法(空的table即{})

    這篇文章主要介紹了Lua判斷Table是否為空的方法(空的table即{}),如何判斷l(xiāng)ua中的table是否是空的table呢,本文就試驗了多個方法,最后得出比較好的判斷方法,需要的朋友可以參考下
    2015-04-04
  • C++遍歷Lua table的方法實例

    C++遍歷Lua table的方法實例

    這篇文章主要介紹了C++遍歷Lua table的方法實例,本文給出了Lua table數(shù)據(jù)格式、C++實現(xiàn)的遍歷代碼以及輸出效果,需要的朋友可以參考下
    2015-04-04
  • Openresty服務器使用lua腳本寫的Hello World簡單實例

    Openresty服務器使用lua腳本寫的Hello World簡單實例

    這篇文章主要介紹了Openresty服務器使用lua腳本寫的Hello World簡單實例,OpenResty (也稱為 ngx_openresty)是一個全功能的 Web 應用服務器。它打包了標準的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴項,需要的朋友可以參考下
    2015-04-04
  • Lua教程(十七):C API簡介

    Lua教程(十七):C API簡介

    這篇文章主要介紹了Lua教程(十七):C API簡介,本文講解了基礎(chǔ)知識、棧、C API中的錯誤處理、Lua調(diào)用C程序、C程序調(diào)用Lua代碼的錯誤處理等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua中使用模塊的一些基礎(chǔ)知識

    Lua中使用模塊的一些基礎(chǔ)知識

    這篇文章主要介紹了Lua中使用模塊的一些基礎(chǔ)知識,說明基本上都融入注釋之中,需要的朋友可以參考下
    2015-07-07
  • Lua中的動態(tài)鏈接實例

    Lua中的動態(tài)鏈接實例

    這篇文章主要介紹了Lua中的動態(tài)鏈接實例,動態(tài)鏈接是指在Lua中使用C編譯的動態(tài)庫,需要的朋友可以參考下
    2014-09-09
  • lua 基礎(chǔ)教程

    lua 基礎(chǔ)教程

    Lua 的語法比較簡單,學習起來也比較省力,但功能卻并不弱。所以,我只簡單的歸納一下Lua的一些語法規(guī)則,使用起來方便好查就可以了。估計看完了,就懂得怎么寫Lua程序了。
    2015-09-09
  • lua文件操作詳解

    lua文件操作詳解

    Lua中關(guān)于文件處理操作是本文要介紹的內(nèi)容,主要是來了解并學習lua中文件的相關(guān)操作,具體內(nèi)容的實現(xiàn)來看本文詳解。
    2016-03-03
  • Lua中的類編程代碼實例

    Lua中的類編程代碼實例

    這篇文章主要介紹了Lua中的類編程代碼實例,本文直接用代碼講解類的創(chuàng)建、類的實例化、類的方法調(diào)用、類的繼承、類的多重繼承等面向?qū)ο缶幊谭椒?需要的朋友可以參考下
    2015-04-04
  • ubuntu 14.04下熟悉lua的語法

    ubuntu 14.04下熟悉lua的語法

    擺在本人目前來說最大的困難就是迅速熟悉Lua語言,后續(xù)的一切工作才有可能,所以必須現(xiàn)在電腦上安裝好Lua開發(fā)環(huán)境,之后program with Lua,我們先來熟悉下lua的語法吧。
    2015-04-04

最新評論

广安市| 博客| 通海县| 荥经县| 瑞金市| 碌曲县| 乐陵市| 威信县| 榆社县| 大余县| 苏州市| 巴东县| 丹巴县| 甘泉县| 唐海县| 乐安县| 应城市| 大英县| 清涧县| 栖霞市| 乾安县| 杭锦后旗| 河源市| 贡觉县| 邯郸县| 屯昌县| 广安市| 克山县| 怀仁县| 邳州市| 牙克石市| 易门县| 陈巴尔虎旗| 涿鹿县| 皋兰县| 仙游县| 巴林左旗| 朔州市| 阳东县| 维西| 搜索|