Iteratory bezstanowe
Proszę pisać iteratory bezstanowe, takie jak ipairs, i implementować ich niestandardowe warianty.
Iteratory bezstanowe to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Czym jest iterator bezstanowy?
Iterator bezstanowy nie przechowuje wewnętrznego stanu. Wszystkie informacje są przekazywane jako argumenty przy każdym wywołaniu: niezmienny stan oraz bieżąca zmienna sterująca.
ipairs: klasyczny przykład
ipairs jest bezstanowy — używa tabeli jako stanu, a bieżącego indeksu jako zmiennej sterującej.
local function myIpairs(t, i)
i = i + 1
local v = t[i]
if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 doIterator squares
Bezstanowy iterator zwracający kolejne kwadraty. Stan przechowuje limit, a zmienna sterująca — bieżącą liczbę.
local function squaresIter(max, n)
n = n + 1
if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
print(n, sq)
endBez potrzeby używania domknięcia
Iteratory bezstanowe nie wymagają tworzenia domknięcia. Ponieważ cały stan jest przekazywany jako argumenty, każda iteracja nie powoduje żadnej alokacji na stercie.
Implementowanie iteratora w stylu pairs
Bezstanowy iterator klucz-wartość używający next jako funkcji iteratora — dokładnie tak działa pairs.
for k, v in next, {a=1, b=2} do
print(k, v)
endFunkcja next
next(t, k) zwraca następną parę klucz-wartość po kluczu k. Aby rozpocząć od początku, należy przekazać nil (lub pominąć argument).
local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)Własny iterator zakresu
Bezstanowy iterator zakresu z krokiem. Stan przechowuje tabelę konfiguracji, a zmienna sterująca — bieżącą wartość.
local function rangeIter(state, n)
n = n + state.step
if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
print(v)
endZaleta wydajnościowa
Iteratory bezstanowe idealnie nadają się do ciasnych pętli. Przy każdym wywołaniu nie powstaje domknięcie, dzięki czemu są szybsze od stanowych iteratorów opartych na domknięciach podczas prostego przechodzenia po danych.
Ograniczenia
Gdy iteracja wymaga złożonego stanu (wielu liczników, kolejek lub dynamicznych danych), iteratory bezstanowe stają się niewygodne. W takiej sytuacji należy użyć stanowych iteratorów opartych na domknięciach lub korutyn.
Połączenie z table.move
Bezstanowy iterator wycinka zwraca elementy z wycinka tabeli. Niezmienny stan przechowuje tablicę i indeks końcowy, a zmienna sterująca — bieżący indeks.
Bezstanowe iteratory biblioteki standardowej
ipairs, pairs (za pośrednictwem next) oraz string.gmatch wewnętrznie korzystają z projektów bezstanowych lub prawie bezstanowych.
Pytanie o iterator bezstanowy
Co sprawia, że iterator jest bezstanowy?
Podsumowanie: iteratory bezstanowe
Iteratory bezstanowe otrzymują cały kontekst jako argumenty, nie wymagają alokowania domknięć i charakteryzują się wysoką wydajnością. Idealnie nadają się do prostego sekwencyjnego przechodzenia po danych, na przykład indeksowania tablicy.
Często zadawane pytania
Czy lekcja „Iteratory bezstanowe” jest bezpłatna?
Tak — pełny tekst „Iteratory bezstanowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Iteratory bezstanowe”?
Proszę pisać iteratory bezstanowe, takie jak ipairs, i implementować ich niestandardowe warianty. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Iteratory bezstanowe”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Protokół ogólnej pętli for
- Iteratory bezstanowe
- Iteratory stanowe z domknięciami
- Generatory oparte na korutynach