Проверка статуса корутины
Часть раздела 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" (завершено)Задание
ЛегкоНапишите функцию 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событий9Корутины для начинающих
Что такое корутина?coroutine create и resumeПауза с помощью coroutine.yield()resume и yieldПроверка статуса корутиныИтоги — Генератор чиселИтоги — Векторная математика