Wstrzymywanie za pomocą coroutine.yield()
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 50 z 54.
coroutine.yield(). To ona pozwala korutynie wstrzymać działanie w jego trakcie i przekazać sterowanie z powrotem do kodu, który ją wznowił.Gdy korutyna wywołuje coroutine.yield(), natychmiast przestaje działać dokładnie w tym miejscu. Gdy następnym razem wywołasz coroutine.resume() dla tej korutyny, będzie kontynuować działanie od miejsca tuż za wywołaniem yield(), jak gdyby nic się nie stało.Oto prosty przykład:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- Wypisuje "One", a następnie wstrzymuje działanie
coroutine.resume(co) -- Wypisuje "Two", a następnie wstrzymuje działanie
coroutine.resume(co) -- Wypisuje "Three", a następnie kończy działanieresume() uruchamia korutynę aż do momentu, gdy napotka ona yield(). Korutyna dokładnie pamięta, gdzie się zatrzymała, wraz ze wszystkimi swoimi zmiennymi lokalnymi i stanem wykonania.Możesz także przekazywać wartości przy zawieszaniu działania. Wszystkie argumenty przekazane do coroutine.yield() stają się wartościami zwracanymi przez coroutine.resume(). Pamiętaj, że coroutine.resume() zawsze zwraca wartość logiczną statusu jako pierwszą wartość (true, jeśli korutyna wykonała się bez błędów, lub false, jeśli wystąpił błąd), a następnie dowolne wartości przekazane do yield():function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status ma wartość true, value ma wartość 10
local status, value = coroutine.resume(co)
print(value) -- Wyświetla: 10
-- status ma wartość true, value ma wartość 20
status, value = coroutine.resume(co)
print(value) -- Wyświetla: 20Wyzwanie
ŁatwyNapisz funkcję createYieldingCoroutine, która przyjmuje count i zwraca ciąg znaków przedstawiający wynik działania korutyny, która wielokrotnie zwraca wartości.
Utwórz korutynę, która zwraca ciąg znaków "Step X" dla każdego kroku od 1 do count, łącznie przez count kroków. Wznów korutynę count razy, aby zebrać wszystkie zwrócone wartości. Zwróć wszystkie zwrócone wartości połączone znakami nowej linii.
Logika:
- Utwórz funkcję, która używa pętli, aby zwracać
"Step 1","Step 2"itd. aż docount - Po wszystkich zwróconych wartościach funkcja powinna zakończyć działanie (bez końcowego zwrócenia wartości "Done")
- Opakuj tę funkcję w korutynę za pomocą
coroutine.create() - Wznów korutynę
countrazy, zbierając każdą zwróconą wartość - Połącz wszystkie zwrócone wartości znakami nowej linii
- Zwróć połączony ciąg znaków
Parametry:
count(liczba): liczba kroków, które mają zostać zwrócone
Zwraca: Ciąg znaków zawierający wszystkie zwrócone wartości oddzielone znakami nowej linii (ciąg znaków). Format: Step 1\nStep 2\nStep 3
Spróbuj swoich sił
function createYieldingCoroutine(count)
-- Wpisz kod tutaj
end
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane iterowanie po tabelach
Iterowanie za pomocą pairs()Iterowanie za pomocą ipairs()pairs() a ipairs()Powtórka — karta postaci2Więcej funkcji biblioteki table
table.concat()Tworzenie tabel i unpack()table.sort()Sortowanie niestandardowe za pomocą funkcjiPodsumowanie — tablica najlepszych wyników5Projekt: silnik tekstowej gry przygodowej
Konfiguracja projektu: pokójŁączenie pokoi3Zaawansowane koncepcje funkcji
Zwracanie wielu wartościFunkcje wariadyczne (...)Funkcje jako wartości pierwszej klasyFunkcje anonimoweCzym jest domknięcie?Podsumowanie — prosty obsługiwacz zdarzeń6Obsługa błędów
Funkcja error()Wywołania chronione za pomocą pcall()Podsumowanie — bezpieczne dzielenie9Korutyny dla początkujących
Czym jest korutyna?Tworzenie i wznawianie korutynyWstrzymywanie za pomocą coroutine.yield()resume i yieldSprawdzanie stanu korutynyPowtórka — generator liczbPowtórka — matematyka wektorowaPoćwicz samodzielnie: Kompilator Lua online