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

Lua中的for循環(huán)和迭代器的秘密探究

 更新時間:2014年09月13日 10:31:33   作者:笨木頭  
這篇文章主要介紹了Lua中的for循環(huán)和迭代器的秘密探究,本文講解了返回兩個值的迭代器、for .. in .. do的真面目、迭代器函數(shù)、恒定狀態(tài)、控制變量初值等內(nèi)容,需要的朋友可以參考下

上一篇我們介紹了,可以使用for循環(huán)來完成迭代器的調(diào)用,十分簡潔。
那么,具體這for循環(huán)做了什么呢?我當(dāng)然沒有去看源碼,我只是看書而已。
資料來源于《Lua程序設(shè)計(jì)》第二版,如果這本書的內(nèi)容沒有錯的話,那么,本篇文章理論上也不會有錯~

1.返回兩個值的迭代器

pairs是能遍歷table的key和value的,而我們之前寫的dieDaiQi函數(shù)只能返回value。
所以,我們要改改dieDaiQi函數(shù),如下:

復(fù)制代碼 代碼如下:

function dieDaiQi(t)
    local i = 0;
    return function()
        i = i + 1; 
      
        if i > #t then
            return nil;
        end         
        return i, t[i];
    end
end

當(dāng)然了,這不是一個安全的迭代器,我們假設(shè)table中沒有nil值。
至于為什么要有一個if i > #t的判斷,待會會說到。
 
使用如下方式調(diào)用迭代器:

復(fù)制代碼 代碼如下:
   
    local t = {"fdsd", "445", "9999"};
    for k, v in dieDaiQi(t) do
        print(k .. "," .. v);
    end

輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 1,fdsd
[LUA-print] 2,445
[LUA-print] 3,9999

2.for .. in .. do的真面目

【for k, v in dieDaiQi(t) do  end】這段代碼實(shí)際上等價于以下代碼:

復(fù)制代碼 代碼如下:

    do
        local _f, _s, _var = dieDaiQi(t);
      
        while true do
            local k, v = _f(_s, _var);
            _var = k;
          
            if _var == nil then
                break;
            end
          
            print(k .. "," .. v);
        end
    end

是不是很復(fù)雜?其實(shí)它和我們之前第一次調(diào)用迭代器的代碼很像,我們先刪掉復(fù)雜的部分,代碼變成如下:

復(fù)制代碼 代碼如下:

    do
        local _f = dieDaiQi(t);
      
        while true do
            local k, v = _f();
          
            if k == nil then
                break;
            end
          
            print(k .. "," .. v);
        end
    end

試試運(yùn)行這段代碼,結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 1,fdsd
[LUA-print] 2,445
[LUA-print] 3,9999

和直接使用for in循環(huán)是一樣的結(jié)果。
 
實(shí)際上,我說的這些都是廢話,因?yàn)槲覀冎熬鸵呀?jīng)說,for in循環(huán)就是用來簡化迭代器的調(diào)用的,所以當(dāng)然是一樣的結(jié)果。

3.迭代器函數(shù)、恒定狀態(tài)、控制變量初值

我們來看看for in真面目的第一句代碼:local _f, _s, _var = dieDaiQi(t);
三個返回值分別代表迭代器函數(shù)(_f)、恒定狀態(tài)(_s)、控制變量初值(_var)。
 
迭代器函數(shù):就不用解釋了,就是我們的dieDaiQi返回的閉合函數(shù)。
恒定狀態(tài):其實(shí)就是一個變量,這個變量一直不變,所以稱之為恒定。
控制變量初值:和恒定相對于的,這是一個會不斷改變的變量。
 
因?yàn)槲冶救藳]有實(shí)際使用過這種特性,所以沒法舉出實(shí)際的例子,只能從理論上去解釋。

1.比如我們的dieDaiQi函數(shù),它只有一個返回值,就是那個閉合函數(shù),所以,_s和_var都是nil。

2.接著調(diào)用local k, v = _f(_s, _var); 這實(shí)際上就是調(diào)用了閉合函數(shù),并且將恒定值和變量值都作為參數(shù)傳遞進(jìn)去。

3.Lua的函數(shù)是很自由的,即使_f函數(shù)本身沒有參數(shù),也可以傳參數(shù)進(jìn)去,不會影響什么,所以,兩個nil值傳進(jìn)去了,沒有任何事情發(fā)生,就像是直接調(diào)用_f()一樣。

4.再下一句代碼:_var = k;  這是把閉合函數(shù)(_f)的第一個返回值保存起來,因?yàn)槊看握{(diào)用閉合函數(shù)(_f)返回值都是下一個迭代值,所以_var每次都是不一樣的值。

5.如果_var的值為nil,則停止循環(huán),結(jié)束迭代。
 
因此,我們編寫迭代器的時候,迭代結(jié)束的方式就是讓第一個返回值為nil。
 
那么,如果我們讓dieDaiQi函數(shù)返回恒定狀態(tài)和控制變量初值,又是什么樣的情況呢?
代碼如下:

復(fù)制代碼 代碼如下:

function dieDaiQi(t)
    local i = 0;
    return function(s, var)
        i = i + 1; 
      
        if i > #t then
            return nil;
        end       
        print("恒定值=" .. s .. ", 變量值=" .. var)
        return i, t[i];
    end, 10, 0
end

留意一下,dieDaiQi函數(shù)現(xiàn)在會返回三個參數(shù),后面的10和0分別就是恒定狀態(tài)和控制變量初值。
同時,閉合函數(shù)也多了兩個參數(shù):s和var。
 
于是,我們再次用for循環(huán)遍歷迭代器:

復(fù)制代碼 代碼如下:

    for k, v in dieDaiQi(t) do
        print(k .. "," .. v);
    end

輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 恒定值=10, 變量值=0
[LUA-print] 1,fdsd
[LUA-print] 恒定值=10, 變量值=1
[LUA-print] 2,445
[LUA-print] 恒定值=10, 變量值=2
[LUA-print] 3,9999

恒定值自然是一直不變的,而變量值在每一次調(diào)用了閉合函數(shù)之后,就會賦值為k的值,所以變量值一直按著table的key值在變化。

可能一時有點(diǎn)混亂,不過,只要對照著for .. in .. do .. end對應(yīng)的實(shí)現(xiàn)代碼,就很好理解了。

4.結(jié)束

終于寫完了,我快撐不住了,一晚上寫兩篇文章,可夠折騰的。

現(xiàn)在眼睛都是花的…我不知道我還能堅(jiān)持多少個晚上…

幸好學(xué)習(xí)的內(nèi)容會越來越難,這樣我就沒法一個晚上就理解透徹,也就沒法每晚寫一篇教程了~

太好了,呵呵。(小若:想偷懶就偷懶吧,說這么多做什么)

相關(guān)文章

  • Lua中的迭代器和泛型for介紹

    Lua中的迭代器和泛型for介紹

    這篇文章主要介紹了Lua中的迭代器和泛型for介紹,任何一種結(jié)構(gòu),只要允許你遍歷集合中所有元素的都可稱之為迭代器,本文就講解了Lua中迭代器的相關(guān)知識和代碼實(shí)例,并講解了泛型for的語法,需要的朋友可以參考下
    2015-04-04
  • 淺析Lua編程中的異常處理

    淺析Lua編程中的異常處理

    這篇文章主要介紹了淺析Lua編程中的異常處理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,要的朋友可以參考下
    2015-05-05
  • 詳解Lua中的元表和元方法

    詳解Lua中的元表和元方法

    Lua中的元表(Metatable)和元方法(Metamethods)是Lua語言中的重要概念,它們允許我們對對象和操作進(jìn)行自定義,本文講給大家詳細(xì)介紹一下Lua中的元表和元方法,需要的朋友可以參考下
    2023-09-09
  • Lua中的for循環(huán)和迭代器的秘密探究

    Lua中的for循環(huán)和迭代器的秘密探究

    這篇文章主要介紹了Lua中的for循環(huán)和迭代器的秘密探究,本文講解了返回兩個值的迭代器、for .. in .. do的真面目、迭代器函數(shù)、恒定狀態(tài)、控制變量初值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 使用nginx+lua實(shí)現(xiàn)信息訪問量統(tǒng)計(jì)

    使用nginx+lua實(shí)現(xiàn)信息訪問量統(tǒng)計(jì)

    這篇文章主要介紹了使用nginx+lua實(shí)現(xiàn)信息訪問量統(tǒng)計(jì),功能很簡單,代碼也很簡潔,有需要的小伙伴可以參考下,然后自由擴(kuò)展。
    2015-03-03
  • Lua學(xué)習(xí)筆記之表達(dá)式

    Lua學(xué)習(xí)筆記之表達(dá)式

    在Lua中,表達(dá)式包括:數(shù)值常量、字符串字面值、變量、單目和雙目運(yùn)算符,函數(shù)調(diào)用,也包括一些非傳統(tǒng)的函數(shù)定義和表結(jié)構(gòu)。今天我們就來詳細(xì)了解下lua中的表達(dá)式
    2015-04-04
  • Lua的迭代器使用中應(yīng)該避免的問題和技巧

    Lua的迭代器使用中應(yīng)該避免的問題和技巧

    這篇文章主要介紹了Lua的迭代器使用中應(yīng)該避免的問題和技巧,本文介紹了避免創(chuàng)建閉合函數(shù)、利用恒定狀態(tài)創(chuàng)造更多變量、不需要for循環(huán)的迭代器等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中ipair和pair的區(qū)別

    Lua中ipair和pair的區(qū)別

    這篇文章主要介紹了Lua中ipair和pair的區(qū)別,ipair和pair都是用來遍歷table用的,需要的朋友可以參考下
    2014-09-09
  • Lua中的閉包小結(jié)

    Lua中的閉包小結(jié)

    這篇文章主要介紹了Lua中的閉包小結(jié),本文對閉包的概念做了講解,同時給出閉包代碼示例,需要的朋友可以參考下
    2014-09-09
  • Lua table的concat方法使用實(shí)例

    Lua table的concat方法使用實(shí)例

    這篇文章主要介紹了Lua table的concat方法使用實(shí)例,本文講解了concat方法的用法及使用實(shí)例,需要的朋友可以參考下
    2015-04-04

最新評論

阿拉善右旗| 禄丰县| 城步| 体育| 东兴市| 张家口市| 灌阳县| 普兰县| 北票市| 颍上县| 达州市| 绥江县| 双流县| 井研县| 南宁市| 永善县| 濮阳市| 东台市| 昆山市| 邢台县| 五家渠市| 阿克苏市| 韩城市| 石门县| 肥城市| 漳州市| 阿拉善右旗| 大安市| 棋牌| 化州市| 龙岩市| 东丽区| 萍乡市| 施甸县| 河间市| 得荣县| 南宫市| 龙山县| 大连市| 绍兴县| 丹棱县|