亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Lua中的迭代器和泛型for學習總結

 更新時間:2014年09月29日 10:16:35   作者:果凍想  
這篇文章主要介紹了Lua中的迭代器和泛型for學習總結,本文講解了迭代器和泛型for的基礎知識、泛型for的語義、無狀態(tài)的迭代器等內容,需要的朋友可以參考下

前言

迭代器就是一種可以遍歷一種集合中所有元素的機制,在Lua中,通常將迭代器表示為函數(shù)。每調用一次函數(shù),就返回集合中的“下一個”元素。每個迭代器都需要在每次成功調用之后保存一些狀態(tài),這樣才能知道它所在的位置及如何走到下一個位置,通過之前博文的總結,閉包對于這樣的任務提供了極佳的支持?,F(xiàn)在我們就用代碼來實現(xiàn)一個簡單的迭代器。

復制代碼 代碼如下:

function values(tb)
     local i = 0
     return function ()
          i = i + 1
          return tb[i]
     end
end
 
local testTb = {10, 20, 30}
for value in values(testTb) do
     print(value)
end

這就是一個最簡單的迭代器,使用閉包來完成整個任務;這只是一個簡單的例子,接下來,再看看泛型for的語義。

泛型for的語義

泛型for比較復雜,它在循環(huán)過程內保存了迭代器函數(shù)。它實際上保存著3個值:一個迭代器函數(shù)、一個恒定狀態(tài)和一個控制變量。接下來,分別進行總結。
泛型for的語法如下:

復制代碼 代碼如下:

for <var-list> in <exp-list> do
     <body>
end

其中,<var-list>是一個或多個變量名的列表,以逗號分隔;<exp-list>是一個或多個表達式的列表,同樣以逗號分隔。通常表達式列表只有一個元素,即一句對迭代器函數(shù)的調用。例如:

復制代碼 代碼如下:

for k, v in pairs(t) do print(k, v) end

for做的第一件事就是對in后面的表達式求值,這些表達式應該返回3個值供for保存:迭代器函數(shù)、恒定狀態(tài)和控制變量的初值。這里和多重賦值是一樣的,只有最后一個表達式才會產(chǎn)生多個結果,并且只會保留前3個值,多余的值會被丟棄;而不夠的話,就以nil補足。

在初始化完成以后,for會以恒定狀態(tài)和控制變量來調用迭代器函數(shù)。然后for將迭代器函數(shù)的返回值賦予變量列表中的變量。如果第一個返回值為nil,那么循環(huán)就終止,否則,for執(zhí)行它的循環(huán)體,隨后再次調用迭代器函數(shù),并重復這個過程。在前言部分的代碼中,只是返回了迭代器函數(shù),并沒有返回恒定狀態(tài)和控制變量。下面通過代碼來說明這個問題,比如:

復制代碼 代碼如下:

for var_1, ..., var_n in <explist> do <block> end -- 就等價于以下代碼:
do
     local _f, _s, _var = <explist>    -- 返回迭代器函數(shù)、恒定狀態(tài)和控制變量的初值
     while true do
          local var_1, ..., var_n = _f(_s, _var)
          _var = var_1
          if _var == nil then break end
          <block>
          end
     end
end

無狀態(tài)的迭代器

所謂“無狀態(tài)的迭代器”,就是一種自身不保存任何狀態(tài)的迭代器。因此,我們可以在多個循環(huán)中使用同一個無狀態(tài)的迭代器,避免創(chuàng)建新的閉包的開銷。

在每次迭代中,for循環(huán)都會用恒定狀態(tài)和控制變量來調用迭代器函數(shù)。一個無狀態(tài)的迭代器可以根據(jù)這兩個值來為下次迭代生成下一個元素。這類迭代器的代表就是ipairs。它可以用來迭代一個數(shù)組的所有元素。如下述演示代碼:

復制代碼 代碼如下:

local aTb = {"One", "Two", "Three"}
for i, v in ipairs(aTb) do
     print(i, v)
end

在這里,迭代器狀態(tài)就是需要遍歷的table(一個恒定狀態(tài),它不會在循環(huán)中改變)及當前的索引值(控制變量)。我們可以使用Lua代碼來實現(xiàn)ipairs,大概就如下代碼:

復制代碼 代碼如下:

local function iter(a, i)
     i = i + 1
     local v = a[i]
     if v then
          return i, v
     end
end
 
function ipairs(a)
     return iter, a, 0
end

函數(shù)pairs與ipairs類似,也是用于遍歷一個table中的所有元素。不同的是,它的迭代器函數(shù)是Lua中的一個基本函next。
復制代碼 代碼如下:

function pairs(a)
     return next, t, nil
end

在調用next(t, k)時,k是table t的一個key。此調用會以table中的任意次序返回一組值:此table的下一個key,及這個key所對應的值。而調用next(t, nil)時,返回table的第一組值。若沒有下一組值時,next返回nil。所以,我們也可以使用next來判斷一個table是否為空。

對于大家經(jīng)常迷惑的ipairs和pairs的區(qū)別,在這里就能看的一清二楚了,ipairs只能用于遍歷index是整型的table,同時,由于ipairs返回的控制變量初值為0,這就決定了,ipairs只能訪問index從1開始的key和value;ipairs不能返回nil,當key對應的值為nil時,就直接終止遍歷;而pairs則沒有要求。關于ipairs和pairs的具體差異,請參考這篇博文:點這里

當然了,有了無狀態(tài)的迭代器,就有了有狀態(tài)的迭代器了,有狀態(tài)的迭代器就是專門用一個table來保存狀態(tài);在無狀態(tài)的迭代器中,我們每一次都是迭代一個table,這個table就是一個無狀態(tài)的table,它不會再遍歷的過程中發(fā)生變化,而有狀態(tài)的迭代器,則會在遍歷的過程中對迭代的table進行變更,迭代的table的狀態(tài)也隨之發(fā)生了變化。這里不做詳細的總結。

相關文章

  • Lua教程(六):編譯執(zhí)行與錯誤

    Lua教程(六):編譯執(zhí)行與錯誤

    這篇文章主要介紹了Lua教程(六):編譯執(zhí)行與錯誤,本文講解了、C代碼、錯誤、錯誤處理與異常、錯誤消息與追溯等內容,需要的朋友可以參考下
    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
  • Lua中的操作符和表達式總結

    Lua中的操作符和表達式總結

    這篇文章主要介紹了Lua中的操作符和表達式總結,本文總結了算術操作符、關系操作符、邏輯操作符、字符串連接、table構造式等,需要的朋友可以參考下
    2014-09-09
  • Lua游戲開發(fā)教程之時區(qū)問題詳解

    Lua游戲開發(fā)教程之時區(qū)問題詳解

    時間顯示問題說白了就是時差問題,這篇文章主要給大家介紹了關于Lua游戲開發(fā)教程之時區(qū)問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • 基于 aLi Lua Web Server 的一個簡單例子

    基于 aLi Lua Web Server 的一個簡單例子

    這篇文章主要介紹了基于 aLi Lua Web Server 的一個簡單例子的代碼,非常簡單,推薦給大家。
    2015-03-03
  • Lua和C++的通信流程代碼實例

    Lua和C++的通信流程代碼實例

    這篇文章主要介紹了Lua和C++的通信流程代碼實例,本文是上一篇的DEMO,本文用代碼講解Lua和C++之間的通信,需要的朋友可以參考下
    2014-09-09
  • Lua中獲取table長度問題探討

    Lua中獲取table長度問題探討

    這篇文章主要介紹了Lua中獲取table長度問題探討,本文非常深入的研究了Lua中table長度的獲取問題,分析了各種各樣的情況,需要的朋友可以參考下
    2015-04-04
  • Lua的堆棧淺析

    Lua的堆棧淺析

    這篇文章主要介紹了Lua的堆棧淺析,本文參考游戲人工智能編程案例精粹中的Lua堆棧索引圖,畫出了自己的一張理解圖,需要的朋友可以參考下
    2014-09-09
  • 淺析C\C++和Lua的通信方式

    淺析C\C++和Lua的通信方式

    lua作為小巧精悍的腳本語言,易于嵌入c/c++中 , 廣泛應用于游戲AI ,實際上在任何經(jīng)常變化的邏輯上都可以使用lua實現(xiàn),配合c/c++實現(xiàn)的底層接口服務,能夠大大降低系統(tǒng)的維護成本。
    2014-09-09
  • OpenResty中正則模式匹配的2種方法詳解

    OpenResty中正則模式匹配的2種方法詳解

    在 OpenResty 中,同時存在兩套正則表達式規(guī)范:Lua 語言的規(guī)范和 Nginx 的規(guī)范,下面這篇文章主要給大家介紹了關于OpenResty中正則模式匹配的2種方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-04-04

最新評論