国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > 綜合 > 正文

Lua中的迭代器和泛型for學(xué)習總結(jié)

2024-07-21 23:04:12
字體:
供稿:網(wǎng)友

前言

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

 

復(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

 

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

泛型for的語義

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

 

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

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

 

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

 

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

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

 

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

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

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

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)和控制變量來調(diào)用迭代器函數(shù)。一個無狀態(tài)的迭代器可以根據(jù)這兩個值來為下次迭代生成下一個元素。這類迭代器的代表就是ipairs。它可以用來迭代一個數(shù)組的所有元素。如下述演示代碼:

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

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,大概就如下代碼:

 

 

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

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。
復(fù)制代碼 代碼如下:

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

在調(diào)用next(t, k)時,k是table t的一個key。此調(diào)用會以table中的任意次序返回一組值:此table的下一個key,及這個key所對應(yīng)的值。而調(diào)用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對應(yīng)的值為nil時,就直接終止遍歷;而pairs則沒有要求。關(guān)于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ā)生了變化。這里不做詳細的總結(jié)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产视频97| 日韩av成人| 国产一起色一起爱| 91超碰在线免费| 福利视频网站导航| 国产主播福利在线| 最新天堂资源在线资源| а√天堂www在线а√天堂视频| 亚洲成年人视频| 国产在线小视频| 五月婷婷视频在线观看| 国产黄色免费在线观看| 91国内精品在线视频| а√资源新版在线天堂| 国产麻豆麻豆| 亚洲精品在线视频免费| 国产美女免费观看| 在线观看免费观看在线91| 久久亚洲资源| 在线中文字幕第一页| 国产毛片视频| 欧洲亚洲精品视频| 国产成人高清精品| 国产字幕在线看| 亚洲成年人视频| 国产95在线|亚洲| 国产精品一区二区婷婷| 亚洲一本大道| 2021av天天| 国产一区二区三区不卡在线| gogogogo高清视频在线| 国产福利微拍精品一区二区| 国产在线视频自拍| 九色精品视频在线观看| 在线āv视频| 国产变态拳头交视频一区二区| 九色精品视频在线观看| eeuss影院在线| 69久久精品| 国产三级在线播放| 国产卡一卡二卡三| 狠狠干在线视频| 欧美日韩国产亚洲沙发| av在线免费播放| av在线不卡免费| www.亚洲视频| 欧美性猛交xxxxbbbb| av日韩国产| 日本电影全部在线观看网站视频| 一区二区三区免费视频网站| 国产精品久久久久久久牛牛| 国产天堂在线播放视频| 国产一二区视频| 天堂在线中文资源| 国产偷激情在线| 精品成人免费自拍视频 | 国产在线免费观看| 91av久久| 尤物在线精品视频| 四虎影院成人| 男人天堂亚洲| 九九热在线观看视频| 天堂在线免费观看| 91福利在线视频| 日本免费黄色| 国产精品剧情一区二区三区| 国产天堂在线| 日本综合一区二区三区| 开心婷婷激情| 国产导航在线| 国产原创精品视频| 国产精品69xx| 另类高清dbsm日本tvav| 国产青青视频| yjizz视频网站在线播放| 国产一级网站视频在线| 亚洲欧美综合乱码精品成人网| 国产在线激情视频| 精品a在线观看| 最近中文av字幕在线中文| 伊人狠狠av| 福利在线视频导航| www.狠狠操.com| 伊人av免费在线观看| 最近久乱中文字幕| 免费特级黄毛片| 在线免费观看你懂的| 国产特级嫩嫩嫩bbb| 九九在线视频| 日本亚洲欧美| 一本大道久久a久久精品| 国产一级免费在线观看| 国产中文字幕第一页| 四虎久久影院| 亚洲成人国产综合| 亚洲综合在线网| 国产极品美女到高潮| 国产午夜电影| 国产网站免费观看| 国产人成在线观看| 国产精品va在线观看视色| 依依成人在线| 久久综合第一页| 日本18视频网站| 99热在线免费观看| 久久国产综合视频| 一本久久精品| 日本视频在线| 免费a级人成a大片在线观看| 免费a级毛片在线播放| 992tv在线观看在线播放| 伊人影院在线视频| 国产乱视频在线观看| 丁香视频五月| 国产在线精品一区二区不卡| 九九热在线免费视频| 黄网站在线观看高清免费| 国产精选一区二区三区不卡催乳| 高清色视频在线观看| 尤物在线视频| 国产馆av播放| 四虎影视成人永久免费观看视频| 精品卡1卡2卡三卡免费网站| 在线视频中文字幕第一页| wwww在线观看| 国产美女在线免费观看| 国产中文在线视频| 国产超碰精品在线观看| 日本视频在线| 国产三级自拍| 日本在线观看| 国产精品国产三级国产试看| av文字幕在线观看| 五月天亚洲激情| 四虎www视频| 国产香蕉视频在线观看| gogogogo高清视频在线| 中文字幕一区二区三区免费视频| 国产精品777一区二区| 欧美婷婷久久五月精品三区| 国产网友自拍电影在线| av片在线观看永久免费| 国产一区二区影视| 亚洲欧美久久婷婷爱综合一区天堂 | 国产系列在线观看| heisi视频网在线观看| 国产区在线视频| 国产中文伊人| 日本动漫同人动漫在线观看| 国产成免费视频| 国产精品粉嫩av| 综合激情亚洲| 国产美女免费观看| 欧美色欧美亚洲另类二区精品| 国产成人综合亚洲欧美在| 国产视频2区| 中文字幕在线免费| 国产蜜臀av在线播放| 成人亚洲一区二区三区| 国产中文在线视频| 国产美女在线播放| 国产蜜臀在线| 丁香婷婷激情| 国产网站免费观看| 国产精品入口麻豆免费| 国产一级黄色| 国产写真视频在线观看| 国产亚洲精品久久久网站好莱 | 四虎国产精品永久| 在线观看中文字幕| 天天干天天摸| 日本黄在线观看| 国产一区在线视频观看| 1区2区3区在线| 国产无遮挡又黄又爽免费网站| 国产青青草在线| 在线a人片免费观看视频| www.大网伊人| 国产卡二和卡三的视频| 国产aa视频| 欧美性猛交xxxxbbbb| 国产另类图片| 国产一二在线观看| av激情在线| 国产美女在线免费观看| 国产黄色免费在线观看| eeuss影院www在线播放| 国产原创在线播放| 91在线最新| 国产字幕在线看| 精品一区二区三区在线成人| www.91av| 国产黄色在线| 久久国产情侣| 97中文字幕| 国产视频一二区| 免费看的av| 国产精品入口免费麻豆| 日本aⅴ写真网站免费| 国产精品伦理一区二区三区 |