迭代器是一個構造,可以用來遍曆集合或容器的元素。 在Lua中,這些集合通常引用表,這些表用於創建各種數據結構,如數組。
迭代器泛型
迭代器泛型提供集合中每個元素的鍵值對。 下麵給出一個簡單的例子。
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
當運行上面的代碼時,將獲得以下輸出 -
1 Lua
2 Tutorial
上面的例子使用了Lua提供的默認ipairs
迭代器函數。
在Lua中,使用函數來表示迭代器。 基於這些迭代器函數中的狀態維護,有兩種主要類型 -
- 無狀態迭代器
- 有狀態迭代器
1. 無狀態迭代器
通過名稱,可以理解這種類型的迭代器函數不會保留任何狀態。下麵來看一個使用列印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
2. 有狀態迭代器
上面使用函數的迭代示例不保留狀態。 每次調用該函數時,它都會根據發送給函數的第二個變數返回集合的下一個元素。 要保持當前元素的狀態,可使用閉包(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
來通過每次調用函數時遞增索引來返回集合中的每個元素。
可使用閉包創建函數迭代器,如上所示,它可以為迭代整個集合的每個時間返回多個元素。