Menu
Coddy logo textTech

Проверка статуса корутины

Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 52 из 54.

Работая с корутинами, вам часто будет необходимо знать, в каком состоянии находится корутина. Выполняется ли она в данный момент? Приостановлена ли она и ожидает ли возобновления? Завершила ли она выполнение?

Lua предоставляет функцию coroutine.status() для ответа на эти вопросы.

Функция coroutine.status() принимает сопрограмму в качестве аргумента и возвращает строку, описывающую её текущее состояние. Существует три возможных состояния:

"suspended"Сопрограмма приостановлена на yield() и может быть возобновлена
"running"Сопрограмма в данный момент выполняется
"dead"Сопрограмма завершила выполнение и не может быть возобновлена снова

Вот как это использовать:

function task()
    coroutine.yield()
    print("Finishing")
end

local co = coroutine.create(task)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "suspended" (приостановлено на yield)

coroutine.resume(co)
print(coroutine.status(co))  -- "dead" (завершено)
challenge icon

Задание

Легко

Напишите функцию checkCoroutineLifecycle, которая принимает resumeCount и возвращает строку, показывающую статус сопрограммы (coroutine) в разные моменты её жизненного цикла.

Создайте сопрограмму, которая один раз выполняет yield, а затем завершается. Проверьте и запишите её статус после создания, после первого возобновления (когда она приостановлена на yield) и после последующих возобновлений на основе resumeCount.

Логика:

  • Создайте функцию, которая один раз возвращает строку "paused" через yield, а затем завершается
  • Оберните эту функцию в сопрограмму с помощью coroutine.create()
  • Проверьте статус сразу после создания с помощью coroutine.status()
  • Возобновите сопрограмму один раз и снова проверьте её статус
  • Возобновите сопрограмму дополнительные разы на основе resumeCount - 1 (общее количество возобновлений = resumeCount)
  • Проверьте итоговый статус после всех возобновлений
  • Верните строку со всеми тремя статусами в формате: initial: [status]\\nafter first resume: [status]\\nfinal: [status]

Параметры:

  • resumeCount (число): Общее количество возобновлений сопрограммы (минимум 1)

Возвращает: Строку, показывающую статус сопрограммы в трех точках её жизненного цикла (string). Формат: initial: suspended\nafter first resume: suspended\nfinal: dead

Шпаргалка

Функция coroutine.status() возвращает текущее состояние корутины в виде строки.

Возможные состояния:

  • "suspended" — корутина приостановлена на вызове yield() и может быть возобновлена
  • "running" — корутина в данный момент выполняется
  • "dead" — корутина завершила выполнение и не может быть возобновлена

Использование:

coroutine.status(coroutine_object)

Пример:

function task()
    coroutine.yield()
    print("Finishing")
end

local co = coroutine.create(task)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "dead"

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

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

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

Все уроки раздела Logic & Flow