resume i yield
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 51 z 54.
W poprzedniej lekcji dowiedziałeś się, jak korutyna może przekazywać wartości z powrotem do głównego kodu za pomocą coroutine.yield(). Komunikacja może jednak przebiegać w obu kierunkach. Możesz też przekazywać wartości do korutyny podczas jej wznawiania.
Gdy wywołujesz coroutine.resume() z dodatkowymi argumentami po obiekcie korutyny, argumenty te są przekazywane do korutyny. Wewnątrz korutyny wartości te stają się wartościami zwracanymi przez wywołanie coroutine.yield(), które ją wstrzymało.
Oto jak to działa:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Uruchamia i wstrzymuje przy yield
coroutine.resume(co, "Hello") -- Przekazuje "Hello" do korutynyGdy korutyna wznawia działanie po raz drugi, przekazany zostaje ciąg znaków "Hello", który staje się wartością zwracaną przez coroutine.yield() i zostaje zapisany w zmiennej value.
Wyzwanie
ŁatwyNapisz funkcję createEchoCoroutine, która przyjmuje initialMessage i zwraca ciąg znaków pokazujący dwukierunkową komunikację między głównym kodem a współprogramem.
Utwórz współprogram, który najpierw przekazuje initialMessage, następnie po wznowieniu odbiera odpowiedź, a na koniec przekazuje tę odpowiedź z powrotem. Funkcja powinna demonstrować przekazywanie wartości zarówno na zewnątrz, jak i do współprogramu.
Logika:
- Utwórz funkcję, która przekazuje
initialMessagei zapisuje wartość zwróconą przez to przekazanie - Po odebraniu wartości przekaż ją z powrotem
- Opakuj tę funkcję we współprogram za pomocą
coroutine.create() - Wznów współprogram po raz pierwszy, aby uzyskać początkową wiadomość
- Wznów współprogram po raz drugi, przekazując
"Response" - Przechwyć wartość przekazaną podczas drugiego wznowienia
- Zwróć ciąg znaków w formacie:
First: [first_yield]\nSecond: [second_yield]
Parametry:
initialMessage(ciąg znaków): Wiadomość, którą współprogram przekaże jako pierwszą
Zwraca: Ciąg znaków pokazujący obie przekazane wartości, oddzielone znakiem nowej linii (ciąg znaków). Format: First: Hello\nSecond: Response
Spróbuj swoich sił
function createEchoCoroutine(initialMessage)
-- 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 pokoiPoćwicz samodzielnie: Kompilator Lua online