Lua入門教程 6 迭代器與泛型for

2021-07-13 17:23:37 字數 2653 閱讀 1937

所謂迭代器就是一種可以遍歷一種集合中所有元素的機制。

每個迭代器都需要在每次成功呼叫之間儲存一些狀態,這樣才知道下一步進行到何處,而closure則為這一任務提供了很好的支援。

function

value

(t) local i = 0

return

function

() i = i + 1; return t[i]

endend

value()在呼叫時會建立乙個closure,其中的i儲存著迭代的索引值,每呼叫一次會加一,直到最後乙個元素,之後將會返回nil

t = 

for element in value(t) do

print(element)

end

泛型for在迴圈過程內部儲存了迭代器函式。實際上儲存著3個值:

乙個迭代器函式

乙個恆定狀態

乙個控制變數

泛型for的語法:

for

in do

end

是乙個或多個變數名的列表,以逗號分隔開

是乙個或多個表示式的列表,以逗號分隔開

變數列表的第乙個元素稱為「控制變數」。迴圈過程中決不會為nil,因為當其為nil時迴圈就已經結束了。for做的第一件事情就是對in後面的表示式進行取值,將會返回3個值給for儲存。初始化步驟後,for會以恆定狀態和控制變數來呼叫迭代器函式。然後for將迭代器函式返回值賦予變數列表中的變數。若第乙個返回值為空則停止迴圈。

一種不儲存任何狀態的迭代器 (可以在多個迴圈中使用他而不會有新的closure開銷

這樣迭代器的典型例子就是ipairs

a = 

for i,v in ipairs(a) do

print(i, v)

end

下面是ipairs的實現

local

function

iter (a, i)

i = i + 1

local v = a[i]

if v then

return i,v

end

function

ipairs (a)

return iter, a, 0

end

當lua呼叫for迴圈中的ipairs(a)時,他將獲得迭代函式,恆定狀態a,控制變數的初始值0。lua呼叫iter(a,0),得到1,a[1] 繼續呼叫iter(a,2),獲得2,a[2]

pairsipairs的區別

pairs的迭代器函式是lua中的乙個基本函式next

迭代器需要儲存許多狀態,使用closoure可以將需要的狀態儲存在恆定狀態中

範例**:

local iterator

function

allwords()

local state =

return iterator, state

endfunction

iterator (state)

while state.line

do--若為有效行的執行內容就進入迴圈

--搜尋下乙個單詞

local s,e = string.find(state.line, "%w+", state.pos)

if s then

--找到了乙個單詞

--更新下乙個位置

state.pos = e + 1

return

string.sub(state.line, s, e)

else

--沒有找到單詞

state.line = io.read() --讀取下一行

state.pos = 1

--從第乙個位置開始

end end

return nil

end

真正的迭代器

迭代器並沒有做實際的迭代,真正做迭代的是for迴圈。而迭代器只是每次迭代提供一些成功後的返回值。還有一種建立迭代器的方式:在迭代器中做實際的迭代操作

可以重寫allwords()函式

function

allwords (f)

forline

in io.lines() do

forword

instring.gmatch(line, "%w+") do

f(word)

endendend

使用這個迭代器時,需要傳入乙個描述迴圈體的函式。如果要列印每個單詞,那麼可以使用print: allwords(print)

Lua學習(七) 迭代器和泛型for

array for key,value in ipairs array doprint key,value end 上面的示例使用由lua中提供的預設ipairs迭代函式。function square iteratormaxcount,currentnumber if currentnumbere...

Lua知識點三 迭代器與泛型for

迭代器是一種支援指標型別的結構,它可以遍歷集合的每乙個元素。迭代器需要保留上一次成功呼叫的狀態和下一次成功呼叫的狀態,也就是他知道來自於 和將要前往 閉包提供的機制可以很容易實現這個任務。記住 閉包是乙個內部函式,它可以訪問乙個或者多個外部函式的外部區域性變數。每次閉包的成功呼叫後這些外部區域性變數...

深入解讀Lua中迭代器與泛型for的使用

泛型for原理 迭代器是一種可以遍歷集合中所有元素的機制,在lua中通常將迭代器表示為函式,每呼叫一次函式,就返回集合中 下乙個 元素。每個迭代器都需要在每次成功呼叫之間保持一些狀態,這樣才能知道它所在的位置及如何步進到下乙個位置,closure就可以完成此項工作。下面的示例是列表的乙個簡單的迭代器...