最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

泛型for的語(yǔ)義

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

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

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

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

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

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

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

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

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

for var_1, ..., var_n in <explist> do <block> end -- 就等價(jià)于以下代碼:
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

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

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

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

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

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

在這里,迭代器狀態(tài)就是需要遍歷的table(一個(gè)恒定狀態(tài),它不會(huì)在循環(huán)中改變)及當(dāng)前的索引值(控制變量)。我們可以使用Lua代碼來(lái)實(shí)現(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類似,也是用于遍歷一個(gè)table中的所有元素。不同的是,它的迭代器函數(shù)是Lua中的一個(gè)基本函next。
復(fù)制代碼 代碼如下:

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

在調(diào)用next(t, k)時(shí),k是table t的一個(gè)key。此調(diào)用會(huì)以table中的任意次序返回一組值:此table的下一個(gè)key,及這個(gè)key所對(duì)應(yīng)的值。而調(diào)用next(t, nil)時(shí),返回table的第一組值。若沒(méi)有下一組值時(shí),next返回nil。所以,我們也可以使用next來(lái)判斷一個(gè)table是否為空。

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

當(dāng)然了,有了無(wú)狀態(tài)的迭代器,就有了有狀態(tài)的迭代器了,有狀態(tài)的迭代器就是專門用一個(gè)table來(lái)保存狀態(tài);在無(wú)狀態(tài)的迭代器中,我們每一次都是迭代一個(gè)table,這個(gè)table就是一個(gè)無(wú)狀態(tài)的table,它不會(huì)再遍歷的過(guò)程中發(fā)生變化,而有狀態(tài)的迭代器,則會(huì)在遍歷的過(guò)程中對(duì)迭代的table進(jìn)行變更,迭代的table的狀態(tài)也隨之發(fā)生了變化。這里不做詳細(xì)的總結(jié)。

相關(guān)文章

最新評(píng)論

崇仁县| 封丘县| 南投市| 黔南| 仲巴县| 喀什市| 咸丰县| 寻乌县| 德保县| 天等县| 顺平县| 论坛| 托克逊县| 温州市| 怀柔区| 镇原县| 华蓥市| 洪洞县| 廊坊市| 宜君县| 连城县| 乐东| 江安县| 博野县| 池州市| 苍梧县| 昌黎县| 乌鲁木齐县| 顺义区| 饶阳县| 灵丘县| 衡阳市| 嵩明县| 拜城县| 班玛县| 临汾市| 兴城市| 江城| 托克逊县| 鸡泽县| 湟源县|