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 coroutine co, passant arguments opcionals.
  • coroutine.yield(...): Suspèn l'execució de la coroutine, retornant opcionalment valors.
  • coroutine.status(co): Retorna l'estat de la coroutine co.
  • 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

  1. Definim una funció myCoroutine que imprimeix un missatge i després suspèn la seva execució amb coroutine.yield.
  2. Creem una coroutine co amb coroutine.create(myCoroutine).
  3. Reprenem la coroutine amb coroutine.resume(co), que imprimeix "Coroutine iniciada" i després es suspèn.
  4. 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ó

  1. Definim la funció printNumbers que imprimeix els números de l'1 al 5, suspenent-se després de cada número amb coroutine.yield.
  2. Creem la coroutine co amb coroutine.create(printNumbers).
  3. 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.

© Copyright 2024. Tots els drets reservats