Menu
Coddy logo textTech

Wstrzymywanie za pomocą coroutine.yield()

Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 50 z 54.

Prawdziwa moc korutyn wynika z funkcji 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łanie
Zauważ, że każde wywołanie resume() 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: 20
challenge icon

Wyzwanie

Łatwy

Napisz 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ż do count
  • 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ę count razy, 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
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Lua online