Menu
Coddy logo textTech

Пауза с помощью coroutine.yield()

Часть раздела Логика и управление потоком путешествия по Lua на Coddy — урок 50 из 54.

Настоящая сила сопрограмм заключается в функции coroutine.yield(). Именно она позволяет сопрограмме приостанавливать свое выполнение на середине и возвращать управление коду, который ее возобновил.Когда корутина вызывает coroutine.yield(), она немедленно останавливает выполнение в этой самой точке. В следующий раз, когда вы вызовете coroutine.resume() для этой корутины, она продолжит работу сразу после вызова yield(), как будто ничего не произошло.Вот простой пример:
function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- Печатает "One", затем приостанавливается
coroutine.resume(co)  -- Печатает "Two", затем приостанавливается
coroutine.resume(co)  -- Печатает "Three", затем завершается
Обратите внимание, как каждый вызов resume() выполняет сопрограмму до тех пор, пока она не достигнет yield(). Сопрограмма точно запоминает, где именно она остановилась, включая все свои локальные переменные и состояние выполнения.Вы также можете передавать значения обратно при вызове `yield`. Любые аргументы, которые вы передаете в coroutine.yield(), становятся возвращаемыми значениями coroutine.resume(). Обратите внимание, что coroutine.resume() всегда возвращает логический status в качестве первого значения (true, если сопрограмма выполнилась без ошибок, или false, если произошла ошибка), за которым следуют любые значения, переданные в yield():
function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)

-- status равен true, value равно 10
local status, value = coroutine.resume(co)
print(value)  -- Выводит: 10

-- status равен true, value равно 20
status, value = coroutine.resume(co)
print(value)  -- Выводит: 20
challenge icon

Задание

Легко

Напишите функцию createYieldingCoroutine, которая принимает count и возвращает строку, показывающую вывод из сопрограммы (coroutine), которая возвращает значения несколько раз через yield.

Создайте сопрограмму, которая возвращает строку "Step X" для каждого шага от 1 до count, всего count шагов. Возобновите выполнение сопрограммы count раз, чтобы собрать все возвращенные значения. Верните все собранные значения, объединенные символом новой строки.

Логика:

  • Создайте функцию, которая использует цикл для возврата значений "Step 1", "Step 2" и т. д. до count через yield
  • После всех вызовов yield функция должна завершиться (без финального yield для "Done")
  • Оберните эту функцию в сопрограмму с помощью coroutine.create()
  • Возобновите выполнение сопрограммы count раз, собирая каждое возвращенное значение
  • Объедините все возвращенные значения с символом новой строки между ними
  • Верните объединенную строку

Параметры:

  • count (число): Количество шагов для возврата через yield

Возвращаемое значение: Строка, содержащая все возвращенные значения, разделенные символами новой строки (string). Формат: Step 1\nStep 2\nStep 3

Попробуйте сами

function createYieldingCoroutine(count)
    -- Напишите код здесь
end
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком