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來通過每次呼叫函式時遞增索引來返回集合中的每個元素。
可使用閉包建立函式疊代器,如上所示,它可以為疊代整個集合的每個時間返回多個元素。