0Pricing
Lua Academy · Lekcja

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 do

Iterator 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)
end

Bez 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)
end

Funkcja 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)
end

Zaleta 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

  1. Protokół ogólnej pętli for
  2. Iteratory bezstanowe
  3. Iteratory stanowe z domknięciami
  4. Generatory oparte na korutynach
← Powrót do Lua Academy