coroutine create y resume
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy — lección 49 de 54.
Ahora que entiendes qué son las corrutinas, aprendamos cómo crearlas y ejecutarlas realmente en Lua.
Para crear una corrutina, utilizas la función coroutine.create(). Esta función toma una función regular como argumento y la envuelve en un objeto de corrutina. Aquí está la sintaxis básica:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)En este punto, la corrutina existe pero aún no ha comenzado a ejecutarse. La función myTask no ha sido llamada. Para iniciar o continuar realmente la ejecución de una corrutina, se utiliza coroutine.resume():
coroutine.resume(co)Cuando llamas a resume() en una corrutina por primera vez, esta comienza a ejecutarse desde el principio de su función. Si la corrutina se ejecuta por completo sin pausarse, se completa y no puede ser reanudada de nuevo.
Aquí tienes un ejemplo completo:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- Imprime ambos mensajesLa corrutina se ejecuta de principio a fin de una sola vez. En la siguiente lección, aprenderás cómo hacer que las corrutinas se pausen en medio de la ejecución.
Desafío
FácilEscribe una función runSimpleCoroutine que reciba un message y devuelva la salida de una corrutina que imprime ese mensaje.
Crea una corrutina usando coroutine.create() que envuelva una función la cual imprima el mensaje proporcionado. Luego, usa coroutine.resume() para ejecutar la corrutina. La función debe devolver el mensaje que fue impreso.
Lógica:
- Define una función que imprima el parámetro message
- Crea una corrutina a partir de esa función usando
coroutine.create() - Reanuda la corrutina usando
coroutine.resume() - Devuelve el mensaje que fue impreso
Parámetros:
message(string): El mensaje que será impreso por la corrutina
Devuelve: El mensaje que fue impreso por la corrutina (string)
Pruébalo tú mismo
function runSimpleCoroutine(message)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo de control
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas3Conceptos avanzados de funciones
Retorno de múltiples valoresFunciones variádicas (...)Funciones como valores de primera claseFunciones anónimas¿Qué es un Closure?Resumen - Manejador de eventos simple9Corrutinas para principiantes
¿Qué es una corrutina?coroutine create y resumePausar con coroutine.yield()resume y yieldComprobar el estado de la corrutinaResumen - Generador de númerosResumen - Matemática de vectores