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.