coroutine
*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.
Se usa una coroutine para realizar múltiples tareas al mismo tiempo desde el mismo script.Tales tareas pueden incluir la producción de valores a partir de entradas o el trabajo en una subrutina al resolver un problema más grande.Una tarea ni siquiera necesita tener un punto final definido, pero sí necesita definir tiempos particulares en los que se produzca (pausa) para dejar que otras cosas se trabajen.
Usando corutinas
Se puede crear una nueva corutina al proporcionar una función a coroutine.create().Una vez creada, una coroutine no comienza a ejecutarse hasta la primera llamada a coroutine.resume() que pasa los argumentos a la función.Esta llamada se devuelve cuando la función se detiene o llama coroutine.yield() y, cuando esto sucede, coroutine.resume() devuelve los valores devueltos por la función, los valores enviados a coroutine.yield() o un mensaje de error.Si ocurre un error, el segundo valor de devolución es el error lanzado.
local function task(...)
-- Esta función podría hacer un poco de trabajo por un tiempo y luego entregar algún valor
coroutine.yield("first") -- Para ser devuelto por coroutine.resume()
-- La función continúa una vez que se reanuda nuevamente
return "second"
end
local taskCoro = coroutine.create(task)
-- Llamar el resumen de la llamada por primera vez, que ejecuta la función desde el principio
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> verdadero, primero (la tarea llamada coroutine.yield())
-- Continúe ejecutando la función hasta que produzca o se detenga
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Durante la vida de la rutina, puedes llamar coroutine.status() para inspeccionar su estado:
<th>Significado</th></tr></thead><tbody><tr><td><b>suspendido</b></td><td>La corutina está esperando ser reanudada. Las corutinas comienzan en este estado y entran en él cuando su función llama <code>coroutine.yield()</code> .</td></tr><tr><td><b>corriendo</b></td><td>La corutina se está ejecutando ahora mismo.</td></tr><tr><td><b>normales</b></td><td>La corutina está esperando la entrega de otra corutina; en otras palabras, ha reanudado otra corutina.</td></tr><tr><td><b>muerto</b></td><td>La función se ha detenido (devuelto o lanzado un error). No se puede usar la coroutine más adelante.</td></tr></tbody>
Estado |
---|
Embalaje de corutinas
Al trabajar con corutinas, también puedes renunciar al uso del objeto de corutina y usar una función de envoltura en su lugar.Tal función de envoltura reanudará una determinada coroutine cuando se llame y devolverá solo los valores entregados.Puedes hacer esto usando coroutine.wrap() :
-- Crear una rutina y devolver una función envolvente que la resumelocal f = coroutine.wrap(task)-- Resume la corutina como si llamáramos coroutine.resume()local result = f()-- Si ocurre un error, se levantará aquí!-- This differs from coroutine.resume() which acts similar to pcall()
El primer valor devuelto de coroutine.resume() describe si una coroutine se ejecutó sin errores.Sin embargo, las funciones devueltas por coroutine.wrap() no harán esto: en cambio, devolverán directamente los valores devueltos o pasados a coroutine.yield() , si es que hay alguno.Si se ha producido un error mientras se ejecuta la función de corutina, el error se levanta en la llamada de la función devuelta.
Ejemplo de patrón productor
Imagina una tarea que produce repeticiones de una palabra: cada vez que produce una repetición, la siguiente producirá una más.Por ejemplo, proporcionar Hello producirá Hello , HelloHello , HelloHelloHello , etc.Para hacer esto, puedes definir repeatThis() :
-- Esta función repite una palabra cada vez que se reanuda su coroutine
local function repeatThis(word)
local repetition = ""
while true do
-- Haz una repetición y luego obtén el resultado
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Para ejecutar esta función como una coroutine, puedes usar coroutine.create() seguido de múltiples llamadas a coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- verdad, Holaprint(coroutine.resume(repetitionCoro)) -- verdad, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Para esta función de productor, también puedes usar coroutine.wrap() para obtener una función que produzca valores:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Holaprint(f()) -- HolaHolaprint(f()) -- HelloHelloHello
Resumen
Funciones
Cierra y pone la coroutine proporcionada en un estado muerto.
Crea una nueva corutina, con cuerpo f. f debe ser una función Luau.
Devuelve true si la corutina esta función se llama dentro de puede producir con seguridad.
Empieza o continúa la ejecución de la corutina co.
Devuelve la coroutine en ejecución.
Devuelve el estado de la coroutinea co como una cadena.
Crea una nueva corutina y devuelve una función que, cuando se llama, resume la corutina.
Suspende la ejecución de la coroutinea.
Funciones
close
Cierra y pone la coroutine proporcionada en un estado muerto.Esta función devuelve true a menos que la corrupción esté en un estado de error, en cuyo caso devuelve false y el mensaje de error.Una corutina que se está ejecutando actualmente no se puede cerrar.Una corutina no se puede reanudar después de que se cierre.
Parámetros
resume
Empieza o continúa la ejecución de la corutina co.La primera vez que reanudas una coroutine, comienza a ejecutar su cuerpo.Los valores ... se pasan como argumentos a la función del cuerpo.Si la corutina ha rendido, reanúdela; los valores ... se pasan como los resultados de la entrega.Si la corutina se ejecuta sin errores, reanuda los retornos de verdad más cualquier valor pasado a yield (si la corutina da yield) o cualquier valor devuelto por la función del cuerpo (si la corutina termina).Si hay algún error, los retornos de resumen se anulan con el mensaje de error más.
Parámetros
status
Devuelve el estado de la corutina co, como una cadena: 'ejecutando', si la corutina está en ejecución (es decir, llamó el estado); 'suspendido', si la corutina está suspendida en una llamada para generar, o si aún no ha comenzado a ejecutarse; 'normal' si la corutina está activa pero no está en ejecución (es decir, ha reanudado otra corutina); y 'muerta' si la corutina ha terminado su función del cuerpo, o si se ha detenido con un error.
Parámetros
Devuelve
wrap
Crea una nueva coroutine, con el cuerpo f.f debe ser una función de Luau.Devuelve una función que resume la corutina cada vez que se llama.Cualquier argumento pasado a la función se comporta como los argumentos adicionales para reanudar.Devuelve los mismos valores devueltos por reanudar, excepto el primer booleano.En caso de error, propaga el error.