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

首頁 > 開發 > 綜合 > 正文

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

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

前言

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

 

復制代碼 代碼如下:

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比較復雜,它在循環過程內保存了迭代器函數。它實際上保存著3個值:一個迭代器函數、一個恒定狀態和一個控制變量。接下來,分別進行總結。
泛型for的語法如下:

 

復制代碼 代碼如下:

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

 

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

 

復制代碼 代碼如下:

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

 

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

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

復制代碼 代碼如下:

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

 

無狀態的迭代器

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

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

復制代碼 代碼如下:

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

在這里,迭代器狀態就是需要遍歷的table(一個恒定狀態,它不會在循環中改變)及當前的索引值(控制變量)。我們可以使用Lua代碼來實現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

函數pairs與ipairs類似,也是用于遍歷一個table中的所有元素。不同的是,它的迭代器函數是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是否為空。

 

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美 在线欧美| 亚洲自拍高清视频网站| 国产精品国语对白| 美女av一区二区| 97婷婷大伊香蕉精品视频| 欧美夫妻性生活视频| 欧美精品18videos性欧美| 欧美一区第一页| 国产精品扒开腿做爽爽爽视频| 欧美在线视频一区| 2019中文字幕在线免费观看| 欧美激情第一页xxx| 亚洲免费视频一区二区| 欧美大片网站在线观看| 国产综合色香蕉精品| 91成人精品网站| 精品国产91久久久久久| 国产精品一区二区性色av| 日本亚洲欧洲色α| 国产偷亚洲偷欧美偷精品| 欧美成人合集magnet| 精品成人国产在线观看男人呻吟| 成人免费大片黄在线播放| 国产精品久久久久77777| 久久久久久国产三级电影| 成人激情在线观看| 日韩中文在线中文网在线观看| 亚洲自拍中文字幕| 午夜精品一区二区三区在线视| 欧美网站在线观看| 免费不卡欧美自拍视频| 亚洲电影免费观看高清| 最近免费中文字幕视频2019| 国产精品男人爽免费视频1| 精品视频久久久久久| 美日韩精品视频免费看| 日韩国产在线播放| 亚洲bt欧美bt日本bt| 日韩激情av在线播放| 青草青草久热精品视频在线网站| 亚洲欧美激情另类校园| 亚洲最大的免费| 亚洲国产精品国自产拍av秋霞| 久久国产视频网站| 亚洲wwwav| 亚洲成人激情在线| 国产一区二区精品丝袜| 亚洲第一网站男人都懂| 国产91av在线| 亚洲美女动态图120秒| 久久久免费观看视频| 在线观看久久av| 国产一区二区美女视频| 国产成人在线一区| 欧美特黄级在线| 色婷婷综合成人| 97精品国产aⅴ7777| 俺也去精品视频在线观看| 黄色成人在线免费| 中文字幕视频在线免费欧美日韩综合在线看| 日韩av在线免费看| 97在线视频精品| 九九热精品在线| 国产精品av在线播放| 日本午夜人人精品| 欧美激情视频一区| 欧美美女18p| 色狠狠久久aa北条麻妃| 亚洲高清福利视频| 亚洲国产欧美久久| 欧美大片免费观看| 米奇精品一区二区三区在线观看| 国产视频自拍一区| 久久影院免费观看| 亚洲级视频在线观看免费1级| 97视频在线播放| 午夜精品一区二区三区视频免费看| 成人激情视频在线| 欧美日韩综合视频| 国产精品福利在线观看网址| 奇门遁甲1982国语版免费观看高清| 亚洲国产成人精品女人久久久| 亚洲欧美在线看| 欧美精品成人91久久久久久久| 亚洲一区二区精品| 日韩中文字幕国产精品| 亚洲一区二区三区久久| 国产精品亚洲第一区| 日本免费久久高清视频| 久久国产精品久久久| 91美女片黄在线观| 亚洲国产精品va在线| 亚洲性xxxx| 欧美性猛交xxxx久久久| 成人在线观看视频网站| 在线播放国产精品| 欧美中文字幕在线视频| 久久全球大尺度高清视频| 国产成人aa精品一区在线播放| 欧美亚洲激情视频| 亚洲尤物视频网| 国产精品久久久久久久久久ktv| 欧洲一区二区视频| 中文字幕v亚洲ⅴv天堂| 日韩av电影免费观看高清| 色噜噜狠狠色综合网图区| 久久久久久久av| 麻豆国产精品va在线观看不卡| 国产精品扒开腿做爽爽爽男男| 91麻豆国产精品| 日韩欧美成人精品| 色综合视频一区中文字幕| 亚洲免费精彩视频| 国产69精品久久久久99| 成人美女免费网站视频| 自拍偷拍亚洲精品| 久久久亚洲影院你懂的| 91亚洲精华国产精华| 隔壁老王国产在线精品| 欧美成人精品h版在线观看| 欧美精品制服第一页| 成人www视频在线观看| 成人a在线观看| 国产精品96久久久久久又黄又硬| 国内精品一区二区三区四区| xxx成人少妇69| 亚洲人成网在线播放| 亚洲成年人在线| 668精品在线视频| 欧美亚洲国产日韩2020| 久久精品国产精品亚洲| 91中文在线视频| 亚洲97在线观看| 色综合老司机第九色激情| 4p变态网欧美系列| 欧美成人免费小视频| 欧美国产在线电影| 久久久久久久久综合| 国产999视频| 福利一区视频在线观看| 在线中文字幕日韩| 爽爽爽爽爽爽爽成人免费观看| 国产精品久久久久久一区二区| 亚洲成人黄色在线观看| 国产精品青青在线观看爽香蕉| 日韩av黄色在线观看| 日韩一区二区福利| 国产成人avxxxxx在线看| 中文字幕一区二区精品| 国产精品三级美女白浆呻吟| 国产免费久久av| 91精品国产91久久久久久久久| 日韩免费高清在线观看| 777国产偷窥盗摄精品视频| 国产精品久久久久久久av大片| 在线观看久久av| 亚洲日本欧美日韩高观看| 国产午夜精品一区理论片飘花| 亚洲国产女人aaa毛片在线| 色综合天天狠天天透天天伊人| 欧美国产精品日韩| 亚洲精品视频中文字幕| 亚洲影影院av| 亚洲天堂男人的天堂|