coroutine

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

A koroutine jest używany do wykonywania wielu zadań jednocześnie z tej samej skrypty.Takie zadania mogą obejmować wytwarzanie wartości z wejść lub wykonywanie pracy na podrutynie przy rozwiązywaniu większego problemu.Zadanie nie musi nawet posiadać określonego punktu końcowego, ale musi określić konkretne czasy, w których odpoczywa (pauza), aby pozwolić innym rzeczom być pracowane.

Używanie koryntów

Nowa korozyna może zostać utworzona poprzez dostarczenie funkcji do coroutine.create().Po utworzeniu korozyna nie zaczyna działać, dopóki nie zostanie wykonany pierwszy wezwanie do coroutine.resume(), który przekazuje argumenty do funkcji.Wezwanie to powraca, gdy funkcja zatrzymuje się lub dzwoni coroutine.yield() i, gdy tak się stanie, coroutine.resume() zwraca wartości zwracane przez funkcję, wartości wysyłane do coroutine.yield() lub wiadomośćo błędzie.Jeśli wystąpi błąd, drugi powrót wartości jest błędem rzuconym.


local function task(...)
-- Ta funkcja może wykonać trochę pracy przez chwilę, a następnie wydać jakąś wartość
coroutine.yield("first") -- Aby zostać zwrócone przez coroutine.resume()
-- Funkcja kontynuuje działanie po ponownym wznowieniu
return "second"
end
local taskCoro = coroutine.create(task)
-- Odwołaj wezwanie po raz pierwszy, które uruchamia funkcję od początku
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> prawda, najpierw (zadanie nazywa się coroutine.yield())
-- Kontynuuj wykonywanie funkcji, aż wyda lub zatrzyma
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

Podczas życia koryny możesz wezwać coroutine.status() , aby sprawdzić jej status:


<th>Znaczenie</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>zawieszone</b></td>
<td>Koroutine czeka na wznowienie. Koroutine zaczynają się w tym stanie i wchodzą w niego, gdy ich funkcja wzywa <code>coroutine.yield()</code>.</td>
</tr>
<tr>
<td><b>wykonywanie</b></td>
<td>Koroutine jest uruchomiona właśnie teraz.</td>
</tr>
<tr>
<td><b>normalny</b></td>
<td>Koroutine czeka na wynik innej koroutiney; innymi słowy, wznowiła inną koroutineę.</td>
</tr>
<tr>
<td><b>martwy</b></td>
<td>Funkcja została wstrzymana (powrócono lub wystąpiono błąd). Kolejka nie może być dalej używana.</td>
</tr>
</tbody>
Status

Pakowanie koryntów

Pracując z korozynami, możesz również pominąć użycie obiektu korozyny i zamiast tego użyć funkcji wrapper.Taka funkcja wrapera wznowi określoną koreutynę, gdy zostanie wezwana, i zwróci tylko zwrócone wartości.Możesz to zrobić za pomocą coroutine.wrap() :


-- Stwórz korozyną i zwróć funkcję zwrotną, która ją wznowi
local f = coroutine.wrap(task)
-- Wznowić koreutynę tak, jak gdybyśmy zawołali coroutine.resume()
local result = f()
-- Jeśli wystąpi błąd, zostanie podniesiony tutaj!
-- This differs from coroutine.resume() which acts similar to pcall()

Pierwsza wartość zwrócona z coroutine.resume() opisuje, czy korozyna uruchomiona bez błędów.Jednak funkcje zwracane przez coroutine.wrap() nie zrobią tego: zamiast tego bezpośrednio zwrócą wartości zwrócone lub przekazane do coroutine.yield(), jeśli takie istnieją.Jeśli wystąpił błąd podczas wykonywania funkcji korynuacji, błąd zostaje podniesiony na wezwaniu zwróconej funkcji.

Przykład wzorca producenta

Wyobraź sobie zadanie, które wytwarza powtórzenia słowa: za każdym razem, gdy wytwarza powtórzenie, następne będzie wytwarzać jedno więcej.Na przykład, dostarczanie Hello wytworzy Hello , HelloHello , HelloHelloHello itp.Aby to zrobić, możesz określić repeatThis() :


-- Funkcja ta powtarza słowo za każdym razem, gdy jej koretyna zostanie wznowiona
local function repeatThis(word)
local repetition = ""
while true do
-- Wykonaj jedną powtórkę, a następnie uzyskaj wynik
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Aby uruchomić tę funkcję jako korozyną, możesz użyć coroutine.create() połączone z wieloma wezwaniami do coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- true, Witaj
print(coroutine.resume(repetitionCoro)) -- prawda, HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

Dla tej funkcji producenta możesz również użyć coroutine.wrap(), aby uzyskać funkcję, która wytwarza wartości:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- Witaj
print(f()) -- WitajWitaj
print(f()) -- HelloHelloHello

Podsumowanie

Funkcje

Funkcje

close

Zamyka i umieszcza dostarczoną korozytę w stanie martwym.Funkcja ta zwraca true, chyba że korozyna jest w stanie błędu, w którym przekazuje false i wiadomośćo błędzie.Nie można zamknąć korynyty, która jest obecnie uruchomiona.Koroutine nie można wznowić po jego zamknięciu.

Parametry

Zwroty

true chyba że zamykana korozyna jest w stanie błędu.

Variant<string, ()>

wiadomośćo błędzie, jeśli istnieje.

create

Tworzy nową korozyną, z ciałem f. f musi być funkcją Luau.

Parametry

Zwroty

isyieldable

Wyświetla true jeśli korozyna ta funkcja jest wezwana w bezpieczny sposób.Poddawanie koryncji wewnątrz metod lub funkcji C jest zabronione, z wyjątkiem pcall i xpcall.

Zwroty

Czy korozyna może bezpiecznie wydać się w tym momencie, czy nie.

resume

Rozpoczyna lub kontynuuje wykonanie koryny co .Po raz pierwszy, gdy wznowisz krotkę, zaczyna uruchamiać swoje ciało.Wartości ... są przekazywane jako argumenty do funkcji ciała.Jeśli korozyna się poddała, wznow ją ponownie; wartości ... są przekazywane jako wyniki z wydajnością.Jeśli korozyna uruchamia się bez błędów, wznowić zwraca prawdę plus wszelkie wartości przekazane do yield (jeśli korozyna przekazuje) lub wszelkie wartości zwracane przez funkcję ciała (jeśli korozyna kończy).Jeśli wystąpi błąd, wznowienie zwraca fałsz plus wiadomośćo błędzie.

Parametry

...: Variant

Zwroty

running

Zwraca uruchomioną krotelinę.

Zwroty

status

Zwraca stan korozyny co, jako ciąg: 'biegnącej', jeśli korozyna jest uruchomiona (czyli nazywa status); 'zawieszonej', jeśli korozyna jest zawieszona w wezwaniu do wydania, lub jeśli jeszcze nie rozpoczęła uruchamiania; 'normalnej', jeśli korozyna jest aktywna, ale nie uruchamia się jeszcze; i 'martwej', jeśli korozyna zakończyła swoją funkcję ciała, lub jeśli została zatrzymana z błędem.

Parametry

Zwroty

Tworzy nową krotkę, z ciałem f.f musi być funkcją Luau.Zwraca funkcję, która wznowia koreutynę za każdym razem, gdy jest wzywana.Wszystkie przekazane argumenty do funkcji zachowują się jak dodatkowe argumenty do wznowienia.Zwraca te same wartości zwracane przez wznowienie, z wyjątkiem pierwszego boola.W przypadku błędu rozprzestrzenia błąd.

Parametry

Zwroty

yield

Tuple<Variant>

Zawiesza wykonanie powołanej korozyny.Wszystkie argumenty do oddania są przekazywane jako dodatkowe wyniki do wznowienia.Poddawanie koryncji wewnątrz metod lub funkcji C jest zabronione, z wyjątkiem pcall i xpcall.

Parametry

...: Tuple

Zwroty

Tuple<Variant>