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