Lua迭代器
迭代器是一種結構,使能夠遍曆所謂的集合或容器中的元素。在Lua中,這些集合通常是指那些用於創建各種數據結構,如數組表。
一般對於迭代器
一個通用的迭代器提供的鍵值對集合中的每個元素。下麵一個簡單的實例。
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
當我們運行上麵的代碼之後將得到下麵的輸出
1 Lua 2 Tutorial
上麵的示例使用由Lua中提供的默認ipairs迭代函數。
在Lua中,我們使用函數來表示迭代器。基於這些迭代器的功能狀態保持,有兩種主要類型:
- 無狀態的迭代器
- 迭代器狀態
無狀態的迭代器
由名字本身就可以明白,這類型的迭代器功能不保留任何狀態。
現在讓我們來看看使用打印n個數的平方簡單的函數,來創建我們自己的迭代器的例子。
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
迭代器狀態
迭代使用功能不保留狀態,前麵的例子。每次調用該函數時,它返回一個基於發送給函數的第二變量的集合的下一個元素。來保存當前元素的狀態,封閉物使用。關閉保留不同職能調用變量的值。要創建一個新的閉包,我們創建了兩個函數,包括封閉自己,一個工廠,創建封閉的功能。
現在讓我們看看創造我們自己的迭代中,我們將使用閉包的一個例子。
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
在上麵的例子中,我們可以看到,元素迭代具有另一種方法裡,使用的本地外部變量索引和計數由每個函數被調用時遞增索引,返回每個集合中的元素。
我們可以創建使用閉包的函數的迭代器,如上圖所示,它可以返回多個元素,每一個我們通過收集循環時間。