Les coroutines són una característica poderosa de Lua que permet la creació de funcions que poden pausar la seva execució i reprendre-la més tard. Això és útil per a tasques com la programació concurrent, la gestió de tasques asíncrones i la simplificació de codi complex.
Què és una Coroutine?
Una coroutine és similar a una funció, però amb la capacitat de suspendre la seva execució en un punt determinat i reprendre-la més tard des del mateix punt. Això es fa mitjançant les funcions coroutine.create, coroutine.resume, coroutine.yield, entre altres.
Funcions Clau
coroutine.create(func): Crea una nova coroutine amb la funciófunc.coroutine.resume(co, ...): Reprèn l'execució de la coroutineco, passant arguments opcionals.coroutine.yield(...): Suspèn l'execució de la coroutine, retornant opcionalment valors.coroutine.status(co): Retorna l'estat de la coroutineco.coroutine.wrap(func): Crea una coroutine i retorna una funció que, quan es crida, reprèn la coroutine.
Exemple Bàsic
Vegem un exemple bàsic per entendre com funcionen les coroutines:
-- Definim una funció que serà utilitzada com a coroutine
function myCoroutine()
print("Coroutine iniciada")
coroutine.yield() -- Pausa l'execució aquí
print("Coroutine reprès")
end
-- Creem la coroutine
co = coroutine.create(myCoroutine)
-- Reprenem la coroutine
coroutine.resume(co) -- Output: "Coroutine iniciada"
-- Reprenem la coroutine de nou
coroutine.resume(co) -- Output: "Coroutine reprès"Explicació del Codi
- Definim una funció
myCoroutineque imprimeix un missatge i després suspèn la seva execució ambcoroutine.yield. - Creem una coroutine
coambcoroutine.create(myCoroutine). - Reprenem la coroutine amb
coroutine.resume(co), que imprimeix "Coroutine iniciada" i després es suspèn. - Tornem a reprendre la coroutine amb
coroutine.resume(co), que imprimeix "Coroutine reprès" i finalitza.
Estats de les Coroutines
Les coroutines poden estar en diferents estats:
- suspended: La coroutine està creada però no ha començat o està suspesa amb
coroutine.yield. - running: La coroutine està en execució.
- dead: La coroutine ha finalitzat la seva execució.
Exemple d'Ús dels Estats
co = coroutine.create(function()
print("Coroutine iniciada")
coroutine.yield()
print("Coroutine reprès")
end)
print(coroutine.status(co)) -- Output: suspended
coroutine.resume(co)
print(coroutine.status(co)) -- Output: suspended
coroutine.resume(co)
print(coroutine.status(co)) -- Output: deadExercici Pràctic
Exercici
Crea una coroutine que imprimeixi els números de l'1 al 5, però que es suspengui després de cada número. Reprèn la coroutine fins que hagi imprès tots els números.
Solució
function printNumbers()
for i = 1, 5 do
print(i)
coroutine.yield()
end
end
co = coroutine.create(printNumbers)
while coroutine.status(co) ~= "dead" do
coroutine.resume(co)
endExplicació de la Solució
- Definim la funció
printNumbersque imprimeix els números de l'1 al 5, suspenent-se després de cada número ambcoroutine.yield. - Creem la coroutine
coambcoroutine.create(printNumbers). - Utilitzem un bucle
whileper reprendre la coroutine fins que el seu estat sigui "dead".
Conclusió
Les coroutines són una eina poderosa per gestionar tasques que requereixen pausar i reprendre l'execució. Amb les funcions coroutine.create, coroutine.resume i coroutine.yield, podem escriure codi més flexible i eficient. Practicar amb coroutines t'ajudarà a comprendre millor la seva utilitat i aplicació en diferents contextos de programació.
En el següent tema, explorarem la Programació Orientada a Objectes en Lua, una altra característica avançada que et permetrà estructurar millor el teu codi.
Curs de Programació en Lua
Mòdul 1: Introducció a Lua
Mòdul 2: Conceptes Bàsics
Mòdul 3: Conceptes Intermedis
Mòdul 4: Conceptes Avançats
- Coroutines
- Programació Orientada a Objectes en Lua
- Tècniques de Depuració
- Optimització del Rendiment
- Ús de l'API C de Lua
Mòdul 5: Aplicacions Pràctiques
- Construcció d'un Joc Simple
- Scripting en Motors de Joc
- Automatització de Tasques amb Lua
- Integració de Lua amb Altres Llenguatges
