疊代器是一個構造,可以用來遍歷集合或容器的元素。 在Lua中,這些集合通常參照表,這些表用於建立各種資料結構,如陣列。
疊代器氾型提供集合中每個元素的鍵值對。 下面給出一個簡單的例子。
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
當執行上面的程式碼時,將獲得以下輸出 -
1 Lua
2 Tutorial
上面的例子使用了Lua提供的預設ipairs
疊代器函式。
在Lua中,使用函式來表示疊代器。 基於這些疊代器函式中的狀態維護,有兩種主要型別 -
通過名稱,可以理解這種型別的疊代器函式不會保留任何狀態。下面來看一個使用列印n
個數位的函式square
建立疊代器的範例。
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
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
函式的工作方式。 如下程式碼所示 -
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
function squares(iteratorMaxCount)
return square,iteratorMaxCount,0
end
for i,n in squares(3)
do
print(i,n)
end
當執行上面的程式碼時,將獲得以下輸出 -
1 1
2 4
3 9
上面使用函式的疊代範例不保留狀態。 每次呼叫該函式時,它都會根據傳送給函式的第二個變數返回集合的下一個元素。 要保持當前元素的狀態,可使用閉包(Closure
)。 閉包在函式呼叫中保留變數值。 要建立一個新的閉包,這裡首先建立兩個函式,包括閉包本身和一個工廠,即建立閉包的函式。
現在來看看一個建立疊代器的例子,並將使用閉包。
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- The closure function is returned
return function ()
index = index + 1
if index <= count
then
-- return the current element of the iterator
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
當執行上面的程式時,將得到以下輸出 -
Lua
Tutorial
在上面的例子中,可以看到elementIterator
中有另一個方法,它使用區域性外部變數index
和count
來通過每次呼叫函式時遞增索引來返回集合中的每個元素。
可使用閉包建立函式疊代器,如上所示,它可以為疊代整個集合的每個時間返回多個元素。