Las corutinas son una característica poderosa y flexible de Lua que permite la creación de funciones que pueden suspender su ejecución y luego reanudarla. Esto es útil para tareas como la programación concurrente, la simulación de procesos y la creación de generadores.
Conceptos Clave
- Corutina: Una corutina es una función que puede suspender su ejecución (con
coroutine.yield
) y luego reanudarla (concoroutine.resume
). - Estados de una Corutina: Las corutinas pueden estar en uno de los siguientes estados:
- Suspended: La corutina está lista para ser ejecutada.
- Running: La corutina está actualmente en ejecución.
- Dead: La corutina ha terminado su ejecución.
Creación y Uso de Corutinas
Creación de una Corutina
Para crear una corutina, utilizamos coroutine.create
, que toma una función como argumento y devuelve una corutina.
function myCoroutine() print("Corutina iniciada") coroutine.yield() -- Suspende la ejecución print("Corutina reanudada") end co = coroutine.create(myCoroutine)
Ejecución de una Corutina
Para iniciar o reanudar una corutina, utilizamos coroutine.resume
.
coroutine.resume(co) -- Salida: Corutina iniciada coroutine.resume(co) -- Salida: Corutina reanudada
Ejemplo Completo
function exampleCoroutine() for i = 1, 3 do print("Corutina en paso " .. i) coroutine.yield() end end co = coroutine.create(exampleCoroutine) print(coroutine.status(co)) -- Salida: suspended coroutine.resume(co) -- Salida: Corutina en paso 1 print(coroutine.status(co)) -- Salida: suspended coroutine.resume(co) -- Salida: Corutina en paso 2 coroutine.resume(co) -- Salida: Corutina en paso 3 print(coroutine.status(co)) -- Salida: dead
Funciones de Corutinas
coroutine.create
Crea una nueva corutina.
coroutine.resume
Reanuda la ejecución de una corutina.
coroutine.yield
Suspende la ejecución de la corutina.
coroutine.status
Devuelve el estado de una corutina.
coroutine.wrap
Crea una corutina y devuelve una función que, cuando se llama, reanuda la corutina.
co = coroutine.wrap(function() for i = 1, 3 do print("Paso " .. i) coroutine.yield() end end) co() -- Salida: Paso 1 co() -- Salida: Paso 2 co() -- Salida: Paso 3
Ejercicio Práctico
Ejercicio 1: Contador con Corutinas
Crea una corutina que actúe como un contador. La corutina debe contar de 1 a 5, suspendiendo su ejecución después de cada número.
Solución
function contador() for i = 1, 5 do print("Contador: " .. i) coroutine.yield() end end co = coroutine.create(contador) for i = 1, 5 do coroutine.resume(co) end
Ejercicio 2: Generador de Números Pares
Crea una corutina que genere números pares desde 2 hasta 10.
Solución
function generadorPares() for i = 2, 10, 2 do print("Número par: " .. i) coroutine.yield() end end co = coroutine.create(generadorPares) for i = 1, 5 do coroutine.resume(co) end
Resumen
En esta sección, hemos aprendido sobre las corutinas en Lua, una herramienta poderosa para manejar la ejecución de funciones de manera controlada. Hemos visto cómo crear, ejecutar y suspender corutinas, así como algunas funciones útiles relacionadas con ellas. Los ejercicios prácticos proporcionados te ayudarán a consolidar estos conceptos y a aplicarlos en situaciones reales. En el próximo tema, exploraremos la Programación Orientada a Objetos en Lua.
Curso de Programación en Lua
Módulo 1: Introducción a Lua
Módulo 2: Conceptos Básicos
Módulo 3: Conceptos Intermedios
Módulo 4: Conceptos Avanzados
- Corutinas
- Programación Orientada a Objetos en Lua
- Técnicas de Depuración
- Optimización del Rendimiento
- Uso de la API C de Lua
Módulo 5: Aplicaciones Prácticas
- Construcción de un Juego Simple
- Scripting en Motores de Juegos
- Automatización de Tareas con Lua
- Integración de Lua con Otros Lenguajes