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