一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua中的for循環和迭代器的秘密探究

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

2020-04-03 20:05笨木頭 Lua

這篇文章主要介紹了Lua中的for循環和迭代器的秘密探究,本文講解了返回兩個值的迭代器、for .. in .. do的真面目、迭代器函數、恒定狀態、控制變量初值等內容,需要的朋友可以參考下

上一篇我們介紹了,可以使用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.結束

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

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

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

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

延伸 · 閱讀

精彩推薦
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
主站蜘蛛池模板: 99这里都是精品 | 色女阁 | 久久www免费人成_看片高清 | 欧美日本一道高清免费3区 欧美人做人爱a全程免费 | 动漫精品午夜在线播放 | 大胆暴露亚洲美女xxxx | 亚洲成综合人影院在院播放 | 九九精品影院 | 外国a级片 | 色综合久久中文字幕网 | 3d欧美人禽交 | 农村美女沟厕嘘嘘被偷看 | 黄色a | 国产伦精品一区二区三区免费迷 | 日本高清视频在线的 | 色花堂国产精品首页第一页 | 精品免费视在线视频观看 | 午夜伦理yy44008影院 | 欧美日韩综合网在线观看 | 无毒成人社区 | 久久久免费观看 | 女教师系列三上悠亚在线观看 | 国产情侣自拍网 | 日韩欧美一区二区三区 | 公妇乱淫在线播放免费观看 | 4455四色永久免费 | 四影虎库最新2021 | 热99re久久精品国产 | 国产成人咱精品视频免费网站 | 久久se视频精品视频在线 | 99色亚洲 | 幻女free性俄罗斯第一次摘花 | 国产一区国产二区国产三区 | 蜜桃视频在线观看官网 | 国产资源视频在线观看 | 久久精品熟女亚洲AV国产 | 天天草人人草 | 丁香网五月天 | 成年视频在线观看免费 | 久久中文字幕免费高清 | 狠狠的撞进去嗯啊h女强男视频 |