迭代器(iterator)是一種對象,它可以用來遍歷標準模板庫容器中的部分或所有元素,每一個迭代器對象表明容器中的肯定的地址數組
在Lua中迭代器是一種支持指針類型的結構,它能夠遍歷集合的每個元素。網絡
泛型 for 迭代器閉包
泛型 for 在本身內部保存迭代函數,實際上它保存三個值:迭代函數、狀態常量、控制變量。函數
泛型 for 迭代器提供了集合的 key/value 對,語法格式以下:指針
for k, v in pairs(t) doorm
print(k, v)對象
end索引
上面代碼中,k, v爲變量列表;pairs(t)爲表達式列表。ip
查看如下實例:element
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
以上代碼執行輸出結果爲:
1 Lua
2 Tutorial
以上實例中咱們使用了 Lua 默認提供的迭代函數 ipairs。
下面咱們看看泛型 for 的執行過程:
首先,初始化,計算in後面表達式的值,表達式應該返回泛型 for 須要的三個值:迭代函數、狀態常量、控制變量;與多值賦值同樣,若是表達式返回的結果個數不足三個會自動用nil補足,多出部分會被忽略。
第二,將狀態常量和控制變量做爲參數調用迭代函數(注意:對於for結構來講,狀態常量沒有用處,僅僅在初始化時獲取他的值並傳遞給迭代函數)。
第三,將迭代函數返回的值賦給變量列表。
第四,若是返回的第一個值爲nil循環結束,不然執行循環體。
第五,回到第二步再次調用迭代函數
在Lua中咱們經常使用函數來描述迭代器,每次調用該函數就返回集合的下一個元素。Lua 的迭代器包含如下兩種類型:
無狀態的迭代器
多狀態的迭代器
無狀態的迭代器
無狀態的迭代器是指不保留任何狀態的迭代器,所以在循環中咱們能夠利用無狀態迭代器避免建立閉包花費額外的代價。
每一次迭代,迭代函數都是用兩個變量(狀態常量和控制變量)的值做爲參數被調用,一個無狀態的迭代器只利用這兩個值能夠獲取下一個元素。
這種無狀態迭代器的典型的簡單的例子是ipairs,它遍歷數組的每個元素。
如下實例咱們使用了一個簡單的函數來實現迭代器,實現 數字 n 的平方:
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratormaxcount< p="">
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
以上實例輸出結果爲:
1 1
2 4
3 9
迭代的狀態包括被遍歷的表(循環過程當中不會改變的狀態常量)和當前的索引下標(控制變量),ipairs和迭代函數都很簡單,咱們在Lua中能夠這樣實現:
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
當Lua調用ipairs(a)開始循環時,他獲取三個值:迭代函數iter、狀態常量a、控制變量初始值0;而後Lua調用iter(a,0)返回1,a[1](除非a[1]=nil);第二次迭代調用iter(a,1)返回2,a[2]……直到第一個nil元素。
多狀態的迭代器
不少狀況下,迭代器須要保存多個狀態信息而不是簡單的狀態常量和控制變量,最簡單的方法是使用閉包,還有一種方法就是將全部的狀態信息封裝到table內,將table做爲迭代器的狀態常量,由於這種狀況下能夠將全部的信息存放在table內,因此迭代函數一般不須要第二個參數。
如下實例咱們建立了本身的迭代器:
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- 閉包函數
return function ()
index = index + 1
if index <= count
then
-- 返回迭代器的當前元素
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
以上實例輸出結果爲:
Lua
Tutorial
以上實例中咱們能夠看到,elementIterator 內使用了閉包函數,實現計算集合大小並輸出各個元素。(編輯:雷林鵬 來源:網絡 侵刪)