Lua迭代器

迭代器是一個構造,可以用來遍曆集合或容器的元素。 在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中有另一個方法,它使用局部外部變數indexcount來通過每次調用函數時遞增索引來返回集合中的每個元素。
可使用閉包創建函數迭代器,如上所示,它可以為迭代整個集合的每個時間返回多個元素。


上一篇: Lua數組 下一篇: Lua表