Latest web development tutorials

Lua Iterator

Iterator (Iterator) ist ein Objekt, das verwendet werden kann, die Standard Template Library Behälterteil oder alle Elemente zu durchlaufen, stellt die Adresse jedes Iteratorobjekt einen Container bestimmt

In Lua Iterator ist ein Zeigertyp der Trägerstruktur, die jedes Element der Auflistung durchlaufen kann.


Generics für Iterator

Generics für die Erhaltung in seinen eigenen internen iterative Funktion, in der Tat, es spart drei Werte: eine iterative Funktion, Zustand Konstanten, Steuerungsgrößen.

Generics für Iteration bietet eine Reihe von Schlüssel / Wert-Paare, die Syntax ist wie folgt:

for k, v in pairs(t) do
    print(k, v)
end

Der obige Code, k, v Variablenliste; Paar (t) für die Liste von Ausdrücken.

Siehe folgende Beispiele:

array = {"Lua", "Tutorial"}

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

Der Ausgang wird der obige Code wird ausgeführt:

1  Lua
2  Tutorial

Die oben genannten Beispiele haben wir die iterative Funktion ipairs Lua standardmäßig zur Verfügung gestellt.

Hier schauen wir uns den Prozess für die Ausführung von Fan:

  • Zunächst initialisieren, berechnet in Wert nach einem Ausdruck, sollte der Ausdruck für den erforderlichen Bereich von drei Werte zurück: eine iterative Funktion, Zustand Konstanten, Steuergrößen und Mehrwertzuweisung, die Anzahl der Ergebnisse, wenn der Ausdruck gibt weniger als drei mit Null Punkten wird automatisch bilden, wird der zusätzliche Teil ignoriert.
  • Zweitens sind die Zustandskonstanten und Regelgröße als Parameter der Iterator-Funktion (Hinweis: für die Struktur, die staatlichen Konstanten nutzlos, nur seine Werte erhalten, wenn initialisiert und auf die Iteration Funktion übergeben) zu nennen.
  • Drittens gibt die Funktion den Wert Iteration in die Variablenliste.
  • Viertens, wenn der Rückgabewert von Null in dem ersten Ende der Schleife, andernfalls wird der Schleifenkörper.
  • Fünftens der Anruf zurück in die zweite Funktion Schritt Iteration wieder

. In Lua wir den Iterator-Funktion beschreiben zu oft, jeder Aufruf dieser Funktion gibt das nächste Element der Kollektion. Lua Iterator enthält die folgenden zwei Typen:

  • Stateless Iterator
  • Multi-State-Iterator

Stateless Iterator

Stateless Iterator verweist behalten keine staatlichen Iteratoren, so können wir die Schleife staatenlos Iterator vermeiden verwenden Erstellen von Schließungen Mehrpreis verbringen.

Jede Iteration, Iterationsfunktionen sind zwei Variablen (Zustand und Steuergrößen konstant) Wert als Parameter staatenlos Iterator nur diese beiden Werte aufgerufen wird das nächste Element zu erhalten.

Ein typisches Beispiel eines solchen einfachen stateless Iterator ist ipairs er durch jedes Element des Arrays.

Das folgende Beispiel wir eine einfache Funktion der Iterator zu erreichen, digital n Quadrat:

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

Das obige Beispiel Ausgabe lautet:

1	1
2	4
3	9

Iterative Traversal Zustand enthält eine Tabelle (während der Zyklus ändert nicht den Zustand konstant) und den aktuellen Index-Index (Regelgrößen), ipairs und iterative Funktion ist sehr einfach, wir in Lua erreichen können:

function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end
 
function ipairs (a)
    return iter, a, 0
end

Wenn Lua ruft ipairs (a), um den Zyklus zu beginnen, erwarb er drei Werte: eine iterative Funktion iter, einen konstanten Zustand der Regelgröße Anfangswert von 0, dann Lua ruft iter (a, 0) ergibt 1, a [1] (es sei denn, ein [1] = nil), die zweite Iteration ruft iter (a, 1) den Wert 2, a [2] ......, bis das erste Element nil.


Multi-State-Iterator

In vielen Fällen, die Notwendigkeit, die Vielzahl der Informationen Iterator Zustand bewahren, anstatt einfach Steuer Konstanten und Variablen angeben, ist der einfachste Weg Verschlüsse zu verwenden, gibt es eine Möglichkeit, alle Zustandsinformationen in eine Tabelle zu verkapseln, die Tabelle als eine iterative der Status der Konstanten, da in diesem Fall alle Informationen, so iterative Funktion in der Regel in der Tabelle gespeichert werden, müssen nicht den zweiten Parameter.

Das folgende Beispiel haben wir unsere eigenen Iteratoren:

array = {"Lua", "Tutorial"}

function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

for element in elementIterator(array)
do
   print(element)
end

Das obige Beispiel Ausgabe lautet:

Lua
Tutorial

Die obigen Beispiele können wir die Verwendung von Verschlüssen in elementIterator Funktion, berechnet zu sehen, die eingestellte Größe und Leistung jedes Elements zu erreichen.