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.

Koroutine są używane do wykonania wielu zadań w jednym czasie z tego samego skryptu. Takie zadania mogą obejmować produkcję wartości z wejść lub wykonanie pracy na subroutine, gdy rozwiązuje się większy problem. Zadanie nie musi nawet mieć zdefiniowanego punktu końca, ale musi zdefiniować określone czasy, w których wynika (wstr

Używanie korutyn

Nową rutynę można utworzyć poprzez zapewnienie funkcji do coroutine.create(). Po utworzeniu rutyny nie zaczyna się ona wykonuje,


local function task(...)
-- Ta funkcja może zrobić trochę pracy, a następnie wydać trochę wartości
coroutine.yield("first") -- Zwrócony przez coroutine.resume()
-- Funkcja ta nadal działa po wznowieniu
return "second"
end
local taskCoro = coroutine.create(task)
-- Zadzwoń do funkcji po raz pierwszy, co uruchomuje funkcję od początku
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> prawdziwy, pierwszy (zadanie nazywa się coroutine.yield()}
-- Kontynuuj działanie funkcji, aż wyprodukuje lub zatrzyma
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

Podczas życia koroutine możesz wezwieć coroutine.status() aby sprawdzić jego stan:


<tbody>
<tr>
<td><b>w zawieszeniu</b></td> <td>Korutyna jest w czekaniu na wznowienie. Korutyny zaczynają się w tym stanie i wchodzą, gdy ich funkcja wzywa <code>coroutine.yield()</code>.</td>
</tr>
<tr>
<td><b>biegnące</b></td>
<td>Korutyna jest teraz uruchomiona.</td>
</tr>
<tr>
<td><b>zwykły</b></td> <td>Koroutine czeka na wynik innej koroutinej; innymi słowy, ponownie uruchomiła inną koroutinej.</td>
</tr>
<tr>
<td><b>martwy</b></td> <td>Funkcja została zatrzymana (zwrócono lub rzucono błąd). Koroutine nie może być dalej używany.</td>
</tr>
</tbody>
StanZnaczenie

Wrapping Coroutines

Podczas pracy z korozyjami możesz również zrezygnować z użycia obiektu korozyjnego i zamiast tego użyć funkcji zapasu. Takie funkcje zapasu będą odtwarzać określony korozyjny obiekt, gdy zostanie on wywołany, i zwrócą tylko zwracane wartości. Możesz to zrobić używając coroutine.wrap() :


-- Utwórz funkcję rutyny i zwróć funkcję wrzutnię, która ją ponownie uruchomi
local f = coroutine.wrap(task)
-- Podsumuj rutynę, jakbyśmy nazywali rutynę resetową.
local result = f()
-- Jeśli nastąpi błąd, zostanie on podniesiony tutaj!
-- This differs from coroutine.resume() which acts similar to pcall()

Pierwsza wartość zwrócona z coroutine.resume() opisuje, czy rutyna została uruchomiona bez błędów. Funkcje zwracane przez coroutine.wrap() nie zrobią tego, ponieważ bezpośrednio zwracają wartości zwrócone lub przesłane do coroutine.yield(),

Przykład wzoru producenta

Pomyśl zadanie, które wytwarza powtórzenia słowa: każdym razem, gdy wytwarza powtórzenie, następne będzie wytwarzać jeszcze jedno. Na przykład, zapewnienie Hello będzie wytwarzać Hello, HelloHello, itp. Aby to zrobić, możesz zdefiniować


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

Aby uruchomić tę funkcję jako rutynę, możesz użyć coroutine.create() następującego przez wiele wezwów do coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- tak, Witaj
print(coroutine.resume(repetitionCoro)) -- tak, 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()) -- Witaj
print(f()) -- HelloHelloHello

Podsumowanie

Funkcje

Funkcje

close

Zamknięcia i umieszczenie dostarczonej rutyny w stanie martwym. Ta funkcja zwraca true , chyba że rutyna nie jest w stanie błędu, w którym przypadku zwraca false i wiadomośćbłędu. Rutyna, która jest obecnie uruchomiona, nie może być zamknięta. Rutyna nie może być wznowiona po jej zamknięciu.

Parametry

Zwroty

true chyba że rutyna zamknięta jest w stanie błędu.

Variant<string, void>

wiadomośćbłędu, jeśli dotyczy.

create

Tworzy nową rutynę, z ciała f. f musi być funkcją Lua.

Parametry

Zwroty

isyieldable

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

Zwroty

Czy rutyna może bezpiecznie wyprodukować się w tym punkcie.

resume

Początkuje lub kontynuuje wykonanie coroutine co . Po raz pierwszy, gdy przywracasz coroutine, zaczyna ona uruchamiać swój ciało. Wartości ... są przekazywane jako argumenty do funkcji body. Jeś

Parametry

...: Variant

Zwroty

Variant<Tuple, string>

running

Zwraca bieżącą rutynę.

Zwroty

status

Zwraca status koroutine co, jako ciąg: 'biegnące', jeśli koroutine jest biegnąca (to jest, nazywa się status); 'wstrzymana', jeśli koroutine jest wstrzymana w wezwaniu do zwrócenia, lub jeśli jeszcze nie rozpoczęła biec; 'normalna' jeśli koroutine jest aktywna, ale nie rozpoczęła biec; i 'martwa', jeśli koroutine zakończyła swą funkc

Parametry

Zwroty

Tworzy nową rutynę, z ciała f. f musi być funkcją Lua. Wynika funkcja, która wznowi coroutine za każdym razem, gdy jest wezwana. Powoduje, że wszystkie argumenty przekazywane funkcji zachowują się jako dodatkowe argumenty do wznowienia. Wynika wartość powrotu, która jest zwracana przez funkcję, z wyjątkiem pierwszej zmiennej. W przypadku błędu rozprzestrzenia błąd.

Parametry

Zwroty

yield

Tuple<Variant>

Wstrzyma wykonanie rutyny wywołania. Wszystkie argumenty do zwrócenia są przekazywane jako dodatkowe wyniki do podsumowania. Wykonywanie rutyny wywołania w metodach metody lub funkcji C jest zabronione, z wyjątkiem pcall i xpcall.

Parametry

...: Tuple

Zwroty

Tuple<Variant>