coroutine

Mostrar obsoleto

*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>
EstadoSignificado

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 reanuda
local 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, Hola
print(coroutine.resume(repetitionCoro)) -- verdadero, HelloHello
print(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")) -- Hola
print(f()) -- Hola
print(f()) -- HelloHelloHello

Resumo

Funções

Funções

close

Parâmetros

Devolução

Variant<string, void>

create

Parâmetros

Devolução

isyieldable

Devolução

resume

Parâmetros

...: Variant

Devolução

Variant<Tuple, string>

running

Devolução

status

Parâmetros

Devolução

Parâmetros

Devolução

yield

Tuple<Variant>

Parâmetros

...: Tuple

Devolução

Tuple<Variant>