Lua - Iteratoren

Iterator ist ein Konstrukt, mit dem Sie die Elemente der sogenannten Sammlung oder des Containers durchlaufen können. In Lua beziehen sich diese Sammlungen häufig auf Tabellen, mit denen verschiedene Datenstrukturen wie Arrays erstellt werden.

Generisches für Iterator

Ein generischer für Iterator liefert die Schlüsselwertepaare von jedem Element in der Sammlung. Ein einfaches Beispiel ist unten angegeben.

array = {"Lua", "Tutorial"}

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

Wenn wir den obigen Code ausführen, erhalten wir die folgende Ausgabe:

1  Lua
2  Tutorial

Im obigen Beispiel wird die von Lua bereitgestellte Standard- Ipair- Iteratorfunktion verwendet.

In Lua verwenden wir Funktionen, um Iteratoren darzustellen. Basierend auf der Zustandserhaltung in diesen Iteratorfunktionen haben wir zwei Haupttypen -

  • Staatenlose Iteratoren
  • Stateful Iteratoren

Staatenlose Iteratoren

Unter dem Namen selbst können wir verstehen, dass diese Art von Iteratorfunktion keinen Status beibehält.

Lassen Sie uns nun ein Beispiel für die Erstellung eines eigenen Iterators mit einer einfachen Funktion sehen, mit der die Quadrate von gedruckt werden n Zahlen.

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

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe.

1	1
2	4
3	9

Der obige Code kann leicht geändert werden, um die Funktionsweise von Ipairs von Iteratoren nachzuahmen . Es ist unten gezeigt.

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

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe.

1	1
2	4
3	9

Stateful Iteratoren

Das vorherige Beispiel für die Iteration mit Funktion behält den Status nicht bei. Bei jedem Aufruf der Funktion wird das nächste Element der Sammlung basierend auf einer zweiten an die Funktion gesendeten Variablen zurückgegeben. Um den Status des aktuellen Elements beizubehalten, werden Verschlüsse verwendet. Beim Schließen werden Variablenwerte über Funktionsaufrufe hinweg beibehalten. Um einen neuen Verschluss zu erstellen, erstellen wir zwei Funktionen, einschließlich des Verschlusses selbst und einer Fabrik, der Funktion, die den Verschluss erstellt.

Lassen Sie uns nun ein Beispiel für die Erstellung eines eigenen Iterators sehen, in dem wir Verschlüsse verwenden werden.

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

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe.

Lua
Tutorial

Im obigen Beispiel sehen wir, dass elementIterator eine andere Methode enthält, die den Index und die Anzahl der lokalen externen Variablen verwendet, um jedes Element in der Auflistung zurückzugeben, indem der Index bei jedem Aufruf der Funktion erhöht wird.

Wir können unsere eigenen Funktionsiteratoren mithilfe des oben gezeigten Abschlusses erstellen und für jede Zeit, in der wir die Sammlung durchlaufen, mehrere Elemente zurückgeben.