coroutine
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Una coroutine se utiliza para realizar múltiples tareas al mismo tiempo desde dentro del mismo script. Estas tareas pueden incluir la producción de valores de los入力 o el rendimiento de un trabajo en un subroutine cuando se soluciona un problema más grande. Una tarea no necesita incluso tener un punto de finalización definido, pero necesita definir un tiempo específico en el que produzca (pausa) para dejar que otras cosas se puedan trabajar.
Usando Coroutines
Una nueva coroutine se puede crear proporcionando una función a coroutine.create() . Una vez creada, una coroutine no comienza a ejecutarse hasta que se llama la primera vez
local function task(...)
-- Esta función puede hacer algo de trabajo para un poco y luego producir algo de valor
coroutine.yield("first") -- Ser devueltos por coroutine.resume()
-- La función continúa una vez que se reanuda
return "second"
end
local taskCoro = coroutine.create(task)
-- Llamar resume por primera vez, que ejecuta la función desde el principio
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> cierto, primero (tarea llamada coroutine.yield()}
-- Continúa ejecutando la función hasta que se acabe o se detenga
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Durante el tiempo de vida de la coroutine, puede llamar coroutine.status() para inspeccionar su estado:
<tbody><tr><td><b>suspendido</b></td> <td>La coroutine está esperando para ser reanudada. Las corutinas comienzan en este estado y entran cuando su función llama <code>coroutine.yield()</code> .</td></tr><tr><td><b>ejecutando</b></td><td>La coroutine está siendo ejecutada ahora mismo.</td></tr><tr><td><b>normal</b></td> <td>La coroutine está esperando el rendimiento de otra coroutine; en otras palabras, ha reanudado otra coroutine.</td></tr><tr><td><b>muerto</b></td> <td>La función ha terminado (se ha devuelto o ha lanzado un error). La coroutine no se puede usar más.</td></tr></tbody>
Estado | Significado |
---|
Envoltura de Coroutines
Al trabajar con corutinas, también puede renunciar al uso del objeto coroutine y en su lugar usar una función de envoltura. Tal función de envoltura reanudará una coroutine particular cuando se llame y solo devolverá los valores obtenidos. Puede hacer esto usando coroutine.wrap() :
-- Cree una rutina y devuelva una función de envoltura que la reanudalocal f = coroutine.wrap(task)-- Resume la coroutinea como si llamáramos coroutinea.resume()local result = f()-- Si ocurre un error, ¡se elevará aquí!-- This differs from coroutine.resume() which acts similar to pcall()
El primer valor devuelto de coroutine.resume() describe si se ha ejecutado una coroutine sin errores. Sin embargo, las funciones devueltas por coroutine.wrap() no lo harán: en cambio, devuelven directamente los valores devueltos o pasados a coroutine.yield(), si es que se ha producido un error mientras se ejecuta la función de coroutine
Ejemplo de patrón de productor
Imagine 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 , 1> HelloHello1> , etc. Para hacer esto, puede definir 4> peatEsto4> :
-- Esta función repite una palabra cada vez que se reanuda su rutina
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 coroutine, puede usar coroutine.create() seguido por múltiples llamadas a coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- verdadero, Holaprint(coroutine.resume(repetitionCoro)) -- verdadero, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Para esta función de productor, también puede usar coroutine.wrap() para obtener una función que produce valores:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Holaprint(f()) -- Holaprint(f()) -- HelloHelloHello
Resumo
Funções
Cierra y pone la rutina proporcionada en un estado muerto.
Crea una nueva coroutine, con body f. f debe ser una función Lua.
Regresa true si la rutina esta función se llama dentro de puede producir con seguridad.
Comienza o continúa la ejecución de la coroutine co .
Devuelve la coroutine de ejecución.
Restablece el estado de la coroutine co como una cadena.
Crea una nueva rutina y devuelve una función que, cuando se llama, reanuda la rutina.
Suspende la ejecución de la coroutine.
Funções
close
Cierra y pone la rutina proporcionada en un estado muerto. Esta función devuelve true a menos que la rutina esté en un estado de error, en cuyo caso devuelve false y el mensaje de error. Una rutina que se está ejecutando no se puede cerrar. Una rutina no se puede reanudar después de que se cierre.
Parâmetros
status
Devuelve el estado de la coroutine co, como una cadena: 'ejecutando', si la coroutine está ejecutando (es decir, que llama estado); 'suspendida', si la coroutine está suspendida en un llamado para rendir, o si aún no ha comenzado a ejecutarse; 'normal' si la coroutine es activa pero no está ejecutando; y 'muerta' si la coroutine ha terminado su función del cuerpo, o si ha terminado con un error.
Parâmetros
Devolução
wrap
Crea una nueva coroutine, con body f. f debe ser una función Lua. Returniza una función que resume la coroutine cada vez que se llama. Cualquier argumento pasado a la función se comporta como los argumentos extra para resume. Returniza los mismos valores que returnan, excepto el primer valor. En caso de error, propaga el error.
Parâmetros
Devolução
yield
Suspende la ejecución de la coroutine de llamada. Cualquier argumento para rendir se pasa como resultados extra para reanudar. El rendimiento de una coroutine dentro de metamétodos o C funciones está prohibido, con la excepción de pcall y xpcall .