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ó
myCoroutine
que imprimeix un missatge i després suspèn la seva execució ambcoroutine.yield
. - Creem una coroutine
co
ambcoroutine.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: dead
Exercici 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) end
Explicació de la Solució
- Definim la funció
printNumbers
que imprimeix els números de l'1 al 5, suspenent-se després de cada número ambcoroutine.yield
. - Creem la coroutine
co
ambcoroutine.create(printNumbers)
. - Utilitzem un bucle
while
per 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