coroutine
*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ą wznowilocal 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, Witajprint(coroutine.resume(repetitionCoro)) -- prawda, HelloHelloprint(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")) -- Witajprint(f()) -- WitajWitajprint(f()) -- HelloHelloHello
Podsumowanie
Funkcje
Zamyka i umieszcza dostarczoną korozytę w stanie martwym.
Tworzy nową korozyną, z ciałem f. f musi być funkcją Luau.
Wyświetla true jeśli korozyna ta funkcja jest wezwana w bezpieczny sposób.
Rozpoczyna lub kontynuuje wykonanie koryny co .
Zwraca uruchomioną krotelinę.
Zwraca status koroutine co jako ciąg znaków.
Tworzy nową korozyną i zwraca funkcję, która, po wezwaniu, wznowi korozynę.
Zawiesza wykonanie koryny.
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
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
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
wrap
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.