coroutine create и resume
Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 49 из 54.
Теперь, когда вы понимаете, что такое coroutine, давайте узнаем, как создавать и запускать их в Lua.
Чтобы создать coroutine, используется функция coroutine.create(). Эта функция принимает обычную функцию в качестве аргумента и оборачивает её в объект coroutine. Вот базовый синтаксис:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)На этом этапе coroutine существует, но её выполнение ещё не началось. function myTask ещё не была вызвана. Чтобы фактически запустить или продолжить выполнение coroutine, используется coroutine.resume():
coroutine.resume(co)Когда вы впервые вызываете resume() у coroutine, она начинает выполнение с начала своей function. Если coroutine выполняется до конца без приостановки, она завершается, и её нельзя возобновить снова.
Вот полный пример:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- Выводит оба сообщенияcoroutine выполняется от начала до конца за один раз. В следующем уроке ты узнаешь, как приостанавливать coroutine в середине выполнения.
Задание
ЛегкоНапишите function runSimpleCoroutine, которая принимает message и возвращает вывод coroutine, печатающей это сообщение.
Создайте coroutine с помощью coroutine.create(), обернув function, которая печатает переданное сообщение. Затем используйте coroutine.resume(), чтобы выполнить coroutine. function должна вернуть message, которое было напечатано.
Логика:
- Определите function, которая печатает параметр message
- Создайте coroutine из этой function с помощью
coroutine.create() - Возобновите coroutine с помощью
coroutine.resume() - Верните message, которое было напечатано
Параметры:
message(строка): message, которое будет напечатано coroutine
Возвращаемое значение: message, напечатанное coroutine (строка)
Попробуйте сами
function runSimpleCoroutine(message)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событий9Корутины для начинающих
Что такое корутина?coroutine create и resumeПауза с помощью coroutine.yield()resume и yieldПроверка статуса корутиныИтоги — Генератор чиселИтоги — Векторная математикаПотренируйтесь самостоятельно: Онлайн-компилятор Lua