所謂迭代器就是一種可以遍歷一種集合中所有元素的機制。每個迭代器都需要在每次成功呼叫之間儲存一些狀態,這樣才知道下一步進行到何處,而
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]
pairs
與ipairs
的區別
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就可以完成此項工作。下面的示例是列表的乙個簡單的迭代器...