coroutine

Mostrar obsoleto

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Uma corrotina é usada para executar várias tarefas ao mesmo tempo a partir do mesmo script.Tarefas como essas podem incluir a produção de valores a partir de entradas ou o trabalho em uma subrotina ao resolver um problema maior.Uma tarefa nem precisa ter um ponto final definido, mas precisa definir tempos específicos em que ela renda (pausa) para que outras coisas possam ser trabalhadas.

Usando Corrotinas

Uma nova corrotina pode ser criada fornecendo uma função para coroutine.create().Uma vez criada, uma corrotina não começa a funcionar até a primeira chamada para coroutine.resume() que passa os argumentos para a função.Essa chamada retorna quando a função parar ou chamar coroutine.yield() e, quando isso acontecer, coroutine.resume() retorna os valores retornados pela função, os valores enviados para coroutine.yield() ou uma mensagem de erro.Se ele cometer erro, o segundo valor de retorno é o erro arremessado.


local function task(...)
-- Essa função pode fazer algum trabalho por um tempo e então renderizar algum valor
coroutine.yield("first") -- Para ser retornado por coroutine.resume()
-- A função continua uma vez que for retomada novamente
return "second"
end
local taskCoro = coroutine.create(task)
-- Resume a chamada pela primeira vez, que executa a função desde o início
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> verdadeiro, primeiro (tarefa chamada coroutine.yield())
-- Continue executando a função até que ela retorne ou pare
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

Durante a vida da corrotina, você pode chamar coroutine.status() para inspecionar seu status:


<th>Significado</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>suspenso</b></td>
<td>A corrotina está esperando para ser retomada. Corrotinas começam neste estado e entram nele quando sua função chama <code>coroutine.yield()</code> .</td>
</tr>
<tr>
<td><b>executando</b></td>
<td>A coroutine está rodando agora.</td>
</tr>
<tr>
<td><b>normal</b></td>
<td>A corrotina está aguardando a produção de outra corrotina; em outras palavras, ela retomou outra corrotina.</td>
</tr>
<tr>
<td><b>morta</b></td>
<td>A função foi interrompida (retornou ou lançou um erro). A corrotina não pode ser usada além disso.</td>
</tr>
</tbody>
Estatus

Envolver Corrotinas

Ao trabalhar com corrotinas, você também pode desistir do uso do objeto coroutine e, em vez disso, usar uma função de wrapper.Uma função de wrapper como essa retomará uma corrotina específica quando for chamada e retornará apenas os valores concedidos.Você pode fazer isso usando coroutine.wrap() :


-- Crie uma corrotina e retorne uma função de wrapper que a resume
local f = coroutine.wrap(task)
-- Resuma a corrotina como se chamássemos coroutine.resume()
local result = f()
-- Se um erro ocorrer, ele será levantado aqui!
-- This differs from coroutine.resume() which acts similar to pcall()

O primeiro valor retornado de coroutine.resume() descreve se uma corrotina foi executada sem erros.No entanto, funções retornadas por coroutine.wrap() não farão isso: em vez disso, elas retornarão diretamente os valores retornados ou passados para coroutine.yield(), se houver.Se um erro ocorreu ao executar a função de corrotina, o erro é levantado na chamada da função retornada.

Exemplo de Padrão de Produtor

Imagine uma tarefa que produza repetições de uma palavra: cada vez que produz uma repetição, a próxima produzirá mais uma.Por exemplo, fornecer Hello produzirá Hello , HelloHello , HelloHelloHello , etc.Para fazer isso, você pode definir repeatThis() :


-- Essa função repete uma palavra sempre que sua corrotina é retomada
local function repeatThis(word)
local repetition = ""
while true do
-- Faça uma repetição e então obtenha o resultado
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Para executar essa função como uma corrotina, você pode usar coroutine.create() seguido por várias chamadas para coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- verdade, Olá
print(coroutine.resume(repetitionCoro)) -- verdade, HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

Para essa função de produtor, você também pode usar coroutine.wrap() para obter uma função que produza valores:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- Olá
print(f()) -- Olá Olá
print(f()) -- HelloHelloHello

Resumo

Funções

Funções

close

Fecha e coloca a corrotina fornecida em um estado morto.Essa função retorna true a menos que a corrotina esteja em um estado de erro, caso em que ela retorna false e a mensagem de erro.Uma corrida que está atualmente em execução não pode ser fechada.Uma corrotina não pode ser retomada depois de ser fechada.

Parâmetros

Devolução

true a menos que a corrotina que está sendo fechada esteja em um estado de erro.

Variant<string, ()>

A mensagem de erro, se houver.

create

Cria uma nova corrotina, com corpo f. f deve ser uma função Luau.

Parâmetros

Devolução

isyieldable

Retorna true se a corrotina esta função for chamada dentro pode fornecer com segurança.Rendendo uma corrotina dentro de metamétodos ou funções C é proibido, com a exceção de pcall e xpcall.

Devolução

Se a coroutine pode ou não entregar com segurança neste ponto.

resume

Inicia ou continua a execução da corrotina co.A primeira vez que você retoma uma corrotina, ela começa a executar seu corpo.Os valores ... são passados como argumentos para a função do corpo.Se a coroutinea rendeu, reinicie-a; os valores ... são passados como os resultados da rendição.Se a coroutinea executar sem erros, retomar retorna verdadeiro mais quaisquer valores passados para gerar (se a coroutinea gerar) ou quaisquer valores retornados pela função do corpo (se a coroutinea terminar).Se houver algum erro, o retorno de resumo retorna falso mais a mensagem de erro.

Parâmetros

...: Variant

Devolução

running

Retorna a corrotina em execução.

Devolução

status

Retorna o status da corrotina co, como uma string / cadeia / texto: 'correndo', se a corrotina estiver correndo (ou seja, ela chamou o status); ' suspensa', se a corrotina estiver suspensa em uma chamada para produzir, ou se ainda não começou a correr; 'normal' se a corrotina estiver ativa, mas não estiver correndo (ou seja, ela retomou outra corrotina); e 'morta' se a corrotina terminou sua função do corpo, ou se parou com um erro.

Parâmetros

Devolução

Cria uma nova corrotina, com corpo f.f deve ser uma função Luau.Retorna uma função que resume a corrotina cada vez que é chamada.Quaisquer argumentos passados à função se comportam como os argumentos extras para retomar.Retorna os mesmos valores retornados pelo retorno, exceto o primeiro booleano.Em caso de erro, propaga o erro.

Parâmetros

Devolução

yield

Tuple<Variant>

Suspende a execução da corrotina chamada.Quaisquer argumentos a serem renderizados são passados como resultados extras para serem retomados.Rendendo uma corrotina dentro de metamétodos ou funções C é proibido, com a exceção de pcall e xpcall.

Parâmetros

...: Tuple

Devolução

Tuple<Variant>