Korutiinipohjaiset generaattorit
Luokaa laiskasti tuotettuja generaattorisarjoja coroutine.wrap-funktiolla.
Korutiinipohjaiset generaattorit on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Korusutiinigeneraattorien käyttötarkoitus
Sulkeumat toimivat hyvin yksinkertaisissa generaattoreissa. Jos generointilogiikka kuitenkin edellyttää sisäkkäisiä silmukoita tai monimutkaista ohjausvirtaa, korutiinigeneraattori on paljon selkeämpi.
coroutine.wrapin perusteet
coroutine.wrap(fn) palauttaa funktion. Jokainen kutsu jatkaa korutiinia, ja coroutine.yield-kutsulla tuotetuista arvoista tulee palautusarvo.
local gen = coroutine.wrap(function()
coroutine.yield(1)
coroutine.yield(2)
coroutine.yield(3)
end)
for v in gen do print(v) endLoppumattoman jonon generaattori
Korutiini voi tuottaa arvoja loputtomasti, joten se sopii erinomaisesti loputtomiin jonoihin, joiden suorittaja lopettaa break-komennolla.
local function naturals()
return coroutine.wrap(function()
local n = 0
while true do
n = n + 1
coroutine.yield(n)
end
end)
end
for v in naturals() do
if v > 5 then break end
print(v)
endPuun läpikäynnin generaattori
Rekursiivinen syvyyssuuntainen läpikäynti on korutiineilla helppo toteuttaa: tuotatte vain arvot rekursiivisista kutsuista ilman erillisen pinon hallintaa.
local function walkTree(node)
return coroutine.wrap(function()
local function recurse(n)
coroutine.yield(n.value)
for _, child in ipairs(n.children or {}) do
recurse(child)
end
end
recurse(node)
end)
endFibonacci-generaattori
Fibonaccin lukujono sopii luontevasti korutiinille: ylläpidätte kahta tilamuuttujaa ja tuotatte kunkin termin.
local function fibs()
return coroutine.wrap(function()
local a, b = 0, 1
while true do
coroutine.yield(a)
a, b = b, a + b
end
end)
end
local fib = fibs()
for i = 1, 8 do print(fib()) endArvojen välittäminen generaattoriin
Jatketulle funktiolle annettu argumentti on yield-lausekkeen palautusarvo, mikä mahdollistaa kaksisuuntaisen viestinnän.
local acc = coroutine.wrap(function()
local total = 0
while true do
local n = coroutine.yield(total)
total = total + (n or 0)
end
end)
acc() -- start
print(acc(10)) -- 10
print(acc(5)) -- 15coroutine.wrap ja coroutine.create
wrap on yksinkertaisempi ja heittää virheen. create palauttaa säieolion ja mahdollistaa virheiden käsittelyn resume-kutsun palautusarvoista.
Generaattoriputki
Ketjuttakaa korutiinipohjaiset generaattorit laiskoiksi käsittelyputkiksi: tuottaja tuottaa raakadataa, suodatin vastaavat alkiot ja kuvaus muunnetut alkiot.
Virheiden välittyminen
Jos kääritty korutiini heittää virheen, myös wrap-funktio heittää virheen. Kutsukaa generaattoria pcall-funktion sisällä, jotta sen käyttäminen olisi turvallista.
Muistitehokkuus
Korutiinigeneraattorit ovat laiskoja: ne laskevat arvot tarpeen mukaan. Näin vältetään suurten väliaikaisten taulukoiden rakentaminen, mikä on merkittävä etu suurilla aineistoilla.
Loppuun käsittely
Kun korutiinifunktio palauttaa arvon (eikä tuota arvoa), seuraava kääritlyn funktion kutsu palauttaa nil-arvon, mikä lopettaa geneerisen for-silmukan luontevasti.
Korutiinigeneraattoria koskeva kysymys
Mitä tapahtuu, kun coroutine.wrap-pohjaisen generaattorin korutiinifunktio palauttaa arvon (eikä tuota arvoa)?
Kertaus: korutiinigeneraattorit
coroutine.wrap muuntaa minkä tahansa korutiinin uudelleenkäytettäväksi generaattorifunktioksi. Sen avulla voidaan toteuttaa laiskoja loppumattomia jonoja, rekursiivisia läpikäyntejä ja käsittelyputken vaiheita selkeällä ohjausvirralla.
Opi Lua tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 40
- Oppitunnit
- 159
Usein kysytyt kysymykset
Onko oppitunti ”Korutiinipohjaiset generaattorit” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Korutiinipohjaiset generaattorit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Korutiinipohjaiset generaattorit”?
Luokaa laiskasti tuotettuja generaattorisarjoja coroutine.wrap-funktiolla. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Korutiinipohjaiset generaattorit”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?
Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Geneerisen for-rakenteen protokolla
- Tilattomat iteraattorit
- Tilalliset iteraattorit sulkeumilla
- Korutiinipohjaiset generaattorit