Lua - 迭代器



迭代器是一種構造,它使您能夠遍歷所謂的集合或容器中的元素。在 Lua 中,這些集合通常指的是表,表用於建立各種資料結構,如陣列。

泛型 For 迭代器

泛型for迭代器提供集合中每個元素的鍵值對。下面給出一個簡單的例子。

main.lua

array = {"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

輸出

當我們執行以上程式碼時,我們將得到以下輸出:

1  Lua
2  Tutorial

以上示例使用 Lua 提供的預設ipairs迭代器函式。

在 Lua 中,我們使用函式來表示迭代器。根據這些迭代器函式中的狀態維護,我們主要有兩種型別:

  • 無狀態迭代器
  • 有狀態迭代器

無狀態迭代器

顧名思義,我們可以理解這種型別的迭代器函式不保留任何狀態。

現在讓我們看看一個建立我們自己的迭代器的例子,它使用一個簡單的函式列印n個數字的平方。

main.lua

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函式的工作方式。如下所示。

main.lua

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

有狀態迭代器

前面使用函式進行迭代的示例不保留狀態。每次呼叫函式時,它都會根據傳送到函式的第二個變數返回集合的下一個元素。為了儲存當前元素的狀態,使用了閉包。閉包跨函式呼叫保留變數值。要建立一個新的閉包,我們建立兩個函式,包括閉包本身和工廠,即建立閉包的函式。

現在讓我們看看一個建立我們自己的迭代器的例子,在這個例子中我們將使用閉包。

main.lua

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透過每次呼叫函式時遞增index來返回集合中的每個元素。

我們可以像上面一樣使用閉包建立我們自己的函式迭代器,並且它可以為每次遍歷集合時返回多個元素。

廣告

© . All rights reserved.