亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua中的for循環和迭代器的秘密探究

2024-07-21 23:04:01
字體:
來源:轉載
供稿:網友

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

1.返回兩個值的迭代器

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

復制代碼 代碼如下:

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

 

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

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

 

輸出結果如下:

復制代碼 代碼如下:

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

 

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

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

復制代碼 代碼如下:

    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

 

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

復制代碼 代碼如下:

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

 

試試運行這段代碼,結果如下:

復制代碼 代碼如下:

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

和直接使用for in循環是一樣的結果。
 
實際上,我說的這些都是廢話,因為我們之前就已經說,for in循環就是用來簡化迭代器的調用的,所以當然是一樣的結果。

 

3.迭代器函數、恒定狀態、控制變量初值

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

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

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

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

4.再下一句代碼:_var = k;  這是把閉合函數(_f)的第一個返回值保存起來,因為每次調用閉合函數(_f)返回值都是下一個迭代值,所以_var每次都是不一樣的值。

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

復制代碼 代碼如下:

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函數現在會返回三個參數,后面的10和0分別就是恒定狀態和控制變量初值。
同時,閉合函數也多了兩個參數:s和var。
 
于是,我們再次用for循環遍歷迭代器:

復制代碼 代碼如下:

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

 

輸出結果如下:

 

復制代碼 代碼如下:

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

 

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

可能一時有點混亂,不過,只要對照著for .. in .. do .. end對應的實現代碼,就很好理解了。

4.結束

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

現在眼睛都是花的…我不知道我還能堅持多少個晚上…

幸好學習的內容會越來越難,這樣我就沒法一個晚上就理解透徹,也就沒法每晚寫一篇教程了~

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级bbbbb性bbbb喷潮片| 国产欧亚日韩视频| 亚洲在线www| 一级做a爰片久久毛片美女图片| 九九视频直播综合网| 欧美高清视频免费观看| 欧美日韩在线视频一区二区| 日韩一区二区精品视频| 欧美激情性做爰免费视频| 亚洲图片欧美日产| 日韩在线激情视频| 精品久久久一区| 久久全球大尺度高清视频| 久久久亚洲欧洲日产国码aⅴ| 91精品国产综合久久香蕉最新版| 国产精品一区二区三区久久久| 成人午夜激情免费视频| 国产精品人成电影| 亚洲成人xxx| 91成人福利在线| 欧美激情一区二区三区久久久| 热re91久久精品国99热蜜臀| 97精品欧美一区二区三区| 奇米影视亚洲狠狠色| 91久久精品美女| 欧美麻豆久久久久久中文| 91久久久久久久久久久| 亚洲自拍偷拍在线| 伊人成人开心激情综合网| 日韩美女视频免费看| 狠狠色香婷婷久久亚洲精品| 91精品国产自产在线观看永久| 亚洲自拍av在线| 日本亚洲欧美三级| 亚洲v日韩v综合v精品v| 国产精品女人久久久久久| 亚洲欧美制服中文字幕| 国内伊人久久久久久网站视频| 国产精品丝袜久久久久久高清| 欧美激情亚洲综合一区| 欧美一区三区三区高中清蜜桃| 欧美国产日韩中文字幕在线| 欧美亚洲伦理www| 久久久久久久久久久av| 国产精品第三页| 日韩成人在线播放| 成人在线一区二区| 亚洲黄色av网站| 日韩在线视频观看正片免费网站| 久久伊人免费视频| 欧美电影电视剧在线观看| 欧美午夜www高清视频| 成人亲热视频网站| 国产精品视频在线观看| 国产精品国产三级国产专播精品人| 国自产精品手机在线观看视频| 一区二区三区美女xx视频| 亚洲国产91精品在线观看| 久久97久久97精品免视看| 欧美情侣性视频| 日韩在线观看免费全| 一本色道久久综合狠狠躁篇怎么玩| 国产精品免费一区豆花| 亚洲日韩中文字幕在线播放| 国产一区二区三区毛片| 色综合男人天堂| 欧美猛交ⅹxxx乱大交视频| 欧美丰满老妇厨房牲生活| 久久香蕉频线观| 自拍偷拍亚洲在线| 亚洲综合最新在线| 欧美激情视频免费观看| 在线性视频日韩欧美| 国产91成人在在线播放| 九九热这里只有在线精品视| 精品一区电影国产| 欧美日韩国产精品专区| 免费不卡在线观看av| 精品视频在线观看日韩| 亚洲国产成人av在线| 欧美日韩视频免费播放| 最近2019年好看中文字幕视频| 久久手机精品视频| 久久91精品国产| 亚洲综合在线做性| 日韩精品在线视频观看| 欧美精品第一页在线播放| 日韩在线观看免费| 黄色成人av网| 91产国在线观看动作片喷水| 日韩精品极品视频| 欧美特级www| 亚洲二区在线播放视频| 国产亚洲精品久久久| 国产精品美女免费看| 欧美国产精品人人做人人爱| 亚洲最大av网| 国产日韩在线免费| 亚洲一区二区久久| 欧美特黄级在线| 日韩av在线精品| 日本亚洲欧洲色α| 亚洲国产日韩欧美在线图片| 久久久久久91香蕉国产| 日韩欧美在线播放| 中文字幕亚洲无线码a| 欧美日韩免费在线| 欧美理论电影网| 中文字幕亚洲精品| 亚洲欧美日韩在线高清直播| 国产一区香蕉久久| 亚洲人成在线免费观看| 91精品国产自产在线老师啪| 日韩欧美第一页| 国产精品免费一区二区三区都可以| 少妇高潮久久久久久潘金莲| 欧美成人午夜剧场免费观看| 日韩精品中文字幕久久臀| 国产精品视频一区国模私拍| 91大神在线播放精品| 日韩激情视频在线播放| 久久久精品久久久| 91精品在线看| 成人性生交大片免费看小说| 清纯唯美亚洲综合| 日韩av网站电影| 在线性视频日韩欧美| 1769国产精品| 亚洲护士老师的毛茸茸最新章节| 欧美高跟鞋交xxxxxhd| 国产福利精品av综合导导航| 国产精品高清免费在线观看| 国产999精品久久久影片官网| 97超级碰碰碰| 成人疯狂猛交xxx| 亚洲剧情一区二区| 亚洲欧洲日产国码av系列天堂| 国产精品女主播视频| 欧美午夜精品久久久久久浪潮| 欧美性69xxxx肥| 日韩在线观看免费高清完整版| 日韩av成人在线观看| 亚洲a中文字幕| 国产一区二区三区在线观看视频| 亚洲欧美日韩一区在线| 欧美在线激情视频| 91色视频在线观看| 美女精品视频一区| 亚洲国产天堂久久综合| 精品久久久久久亚洲国产300| 日日噜噜噜夜夜爽亚洲精品| 成人免费观看网址| 久久精品国产久精国产一老狼| 久久久人成影片一区二区三区| 国产精品2018| 5278欧美一区二区三区| 国产精品久久一| 奇米成人av国产一区二区三区| 欧美日韩中文在线观看| 久久精品国产亚洲一区二区| 日本精品一区二区三区在线播放视频| 日韩免费不卡av| 日韩精品视频在线| 国产精品精品国产|