lua學習筆記之迭代器與范型for
1、 迭代器與閉包
迭代器是一種支援指標型別的結構,它可以遍歷集合的每乙個元素。迭代器需要保留上一次成功呼叫的狀態和下一次成功呼叫的狀態,也就是它知道來自於**和將要前往**。閉包提供的機制可以很容易實現這個任務。記住:閉包是以惡搞內部函式,它可以訪問乙個或者多個外部函式的外部區域性變數。每一次閉包的成功呼叫後這些區域性變數都儲存他們的值。
2、 範性for的語義
範性for的文法如下:
for in do
end是乙個或多個以逗號分隔的變數列表,是乙個或多個以逗號分割的表示式列表,通常情況下exp-list只有乙個值。
for line in io.lines() do
io.write(line,」\」)
end
我們稱變數列表中第乙個變數為控制變數,其值為nil時迴圈結束。
3、 無狀態的迭代器
無狀態的迭代器是指不保留任何狀態的迭代器,因此在迴圈中我們可以利用無狀態迭代器避免建立閉包花費額外的代價。
每一次迭代,迭代函式都是用兩個變數(狀態常量和控制變數)的值,作為引數被呼叫,乙個無狀態的迭代器只利用這個兩個值可以獲取下乙個元素。這種無狀態迭代器的典型簡單例子是ipairs。
a =
for i,v ininpairs(a) do
print(i,v)
end迭代的狀態包括被遍歷的表和當前的索引下標,ipairs和迭代函式都很簡單,我們在lua中可以這樣實現:
function iter (a,i)
i = i=1
local v = a[i]
if v then
return iv
endend
function ipairs (a)
return iter ,a,0
end4、 多狀態的迭代
很多情況下,迭代器需要儲存多個狀態需資訊而不是簡單的狀態控制常量和控制變數,最簡單的方法是使用閉包,還有一種方法就是將所有的狀態資訊封裝到table內,將table作為迭代器的狀態常量。
我們應該盡可能的寫無狀態的的迭代器,因為這樣的迴圈的時候由for儲存狀態,不需要建立物件花費的代價,如果不能用無狀態的迭代器實現,應盡可能使用閉包,盡可能不要使用table這種方式,因為建立乙個閉包的代價要比建立table小,另外lua處理閉包比處理table速度快。
5、 真正的迭代器
有一種方式建立乙個在內部完成的迭代器,這樣我們使用迭代器的時候就不需要使用迴圈,我們僅僅使用每一次迭代需要處理的任務作為引數呼叫迭代器即可。
Lua 學習筆記(六) 迭代器和泛型for
今天開始迭代器的學習,看了 programming in lua 這一章,看了2遍才稍微弄懂了一點兒,在這裡與大家一起分享。一 迭代器就是遍歷集合的元素 這是乙個簡單的迭代器程式,用途是遍歷t這個table中的值 function value t local i 0 return function ...
Lua學習(七) 迭代器和泛型for
array for key,value in ipairs array doprint key,value end 上面的示例使用由lua中提供的預設ipairs迭代函式。function square iteratormaxcount,currentnumber if currentnumbere...
Lua入門教程 6 迭代器與泛型for
所謂迭代器就是一種可以遍歷一種集合中所有元素的機制。每個迭代器都需要在每次成功呼叫之間儲存一些狀態,這樣才知道下一步進行到何處,而closure則為這一任務提供了很好的支援。function value t local i 0 return function i i 1 return t i end...