Latest web development tutorials

Lua iterator

Iteracyjnej (iteracyjnej) jest to obiekt, który może być używany do przechodzenia przez część pojemnikową Standard Template bibliotece lub wszystkie elementy, adres każdego obiektu iteracyjnej przedstawia pojemnik określony

W Lua iterator jest typu wskaźnik struktury wsparcia, które mogą przechodzić przez każdy element kolekcji.


Leki generyczne dla iteratora

Leki generyczne dla zachowania we własnym wewnętrznym funkcji iteracyjny, w rzeczywistości, to ratuje trzy wartości: iteracyjny funkcji państwowych, stałe, zmienne kontrolne.

Leki generyczne dla iteracji zawiera zbiór par klucz / wartość, składnia jest następująca:

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

Powyższy kod, k, v zmienną wykazu; para (T) na liście wyrażeń.

Patrz następujące przykłady:

array = {"Lua", "Tutorial"}

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

Wyjście jest powyższy kod jest wykonywany:

1  Lua
2  Tutorial

Powyższe przykłady użyliśmy iteracyjny Ipairs funkcji Lua przewidzianych domyślnie.

Tutaj patrzymy na proces realizacji Fan:

  • Po pierwsze, zainicjować, obliczone wartości po wyrażeniu wyrażenie powinno wrócić do wymaganego zakresu trzech wartości: iteracyjny funkcji, stałych państwowych, zmiennych kontrolnych oraz przypisanie wielu wartości, liczba wyników, jeśli wyrażenie zwraca mniej niż trzy z nil punkty automatycznie uzupełnić, dodatkowa część zostanie zignorowane.
  • Po drugie, stałe i zmienne sterowanie państwowe jako parametr wywołania funkcji iterator (Uwaga: dla struktury, stałe państwowe bezużyteczne, po prostu swoje wartości, kiedy zainicjowany i przekazywany do funkcji iteracji).
  • Po trzecie, funkcja zwraca wartość iteracji do listy zmiennych.
  • Po czwarte, jeśli wartość zwracana zera w pierwszym końcu pętli, inaczej ciało pętli.
  • Po piąte, połączenie z powrotem do drugiej funkcji krokiem iteracji ponownie

, W Lua często używamy, aby opisać funkcję iterator, każde wywołanie tej funkcji zwraca następny element kolekcji. Lua iterator zawiera następujące dwa typy:

  • bezpaństwowcem iterator
  • iterator Multi-state

bezpaństwowcem iterator

Bezpaństwowcem iterator odnosi się nie zachowuje żadnych iteratory państwowe, więc możemy użyć pętli bezpaństwowcem iterator uniknąć tworzenia zamknięcia wydać dodatkowe cenę.

Każda iteracja, funkcje iteracji są dwie zmienne (zmienne stanu i kontroli stała) wartość jako parametr nazywany jest bezpaństwowcem iterator używając tylko tych dwóch wartości, aby dostać się do następnego elementu.

Typowym przykładem takiej prostej bezstanowej iteracyjnej jest Ipairs, że przez każdy element tablicy.

Poniższy przykład używamy prostą funkcję do osiągnięcia iterator cyfrowej n do kwadratu:

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

Powyższy przykład wyjście jest:

1	1
2	4
3	9

Iteracyjny stan przejścia zawiera tabelę (podczas cyklu nie zmienia stan stały) i aktualny wskaźnik indeksu (zmienne Control), Ipairs i funkcja iteracyjna jest bardzo proste, możemy osiągnąć w Lua:

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

Gdy Lua wzywa Ipairs (a), aby rozpocząć cykl, zdobył trzy wartości: iteracyjny funkcji ITER, stały stan, sterowanie zmienną wartość początkową 0; następnie Lua wywołuje ITER (a, 0) zwraca 1, a [1] (o ile [1] = nil); druga iteracja zwraca ITER (1) zwraca 2, w [2] ...... aż do pierwszego elementu nil.


iterator Multi-state

W wielu przypadkach trzeba zachować wiele informacji o stanie iterator zamiast po prostu stwierdzić, stałych kontroli i zmienne, najprostszym sposobem jest użycie zamknięć, istnieje sposób, aby ująć wszystkie informacje państwowego w tabeli, jako iteracyjny status stałych, ponieważ w tym przypadku wszystkie informacje mogą być przechowywane w tabeli, to funkcja iteracyjny zwykle nie wymagają drugi parametr.

W poniższym przykładzie stworzyliśmy nasze własne iteratory:

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

Powyższy przykład wyjście jest:

Lua
Tutorial

Powyższe przykłady widzimy, stosowanie zamknięć w obrębie funkcji elementIterator, obliczoną w celu osiągnięcia zadanej wielkości i wydajności każdego elementu.