resume и yield
Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 51 из 54.
В предыдущем уроке вы узнали, как корутина может передавать значения обратно в основной код с помощью coroutine.yield(). Но взаимодействие может происходить в обоих направлениях. Вы также можете отправлять значения внутрь корутины при её возобновлении.
Когда вы вызываете coroutine.resume() с дополнительными аргументами после объекта сопрограммы, эти аргументы передаются в сопрограмму. Внутри сопрограммы эти значения становятся возвращаемыми значениями вызова coroutine.yield(), который её приостановил.
Вот как это работает:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Запускает и приостанавливает на yield
coroutine.resume(co, "Hello") -- Передает "Hello" в корутинуКогда корутина возобновляется во второй раз, строка "Hello" передается внутрь и становится возвращаемым значением coroutine.yield(), которое сохраняется в переменной value.
Задание
ЛегкоНапишите функцию createEchoCoroutine, которая принимает initialMessage и возвращает строку, демонстрирующую двустороннюю связь между основным кодом и сопрограммой (coroutine).
Создайте сопрограмму, которая сначала возвращает (yield) initialMessage, затем получает ответ при возобновлении работы и, наконец, возвращает этот ответ обратно. Функция должна демонстрировать передачу значений как из сопрограммы, так и в неё.
Логика:
- Создайте функцию, которая выполняет yield для
initialMessageи сохраняет возвращаемое значение этого yield - После получения значения выполните yield этого значения обратно
- Оберните эту функцию в сопрограмму с помощью
coroutine.create() - Возобновите работу сопрограммы в первый раз, чтобы получить начальное сообщение
- Возобновите работу сопрограммы во второй раз, передав
"Response" - Захватите значение, полученное при втором возобновлении
- Верните строку в формате:
First: [first_yield]\nSecond: [second_yield]
Параметры:
initialMessage(string): Сообщение, которое сопрограмма вернет первым
Возвращает: Строку, показывающую оба возвращенных значения, разделенных символом новой строки (string). Формат: First: Hello\nSecond: Response
Шпаргалка
Вы можете передавать значения в корутину при её возобновлении, передавая дополнительные аргументы в coroutine.resume(). Эти аргументы становятся возвращаемыми значениями вызова coroutine.yield(), который приостановил корутину.
function receiver()
local value = coroutine.yield() -- Приостанавливается и ожидает ввода
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Запускает корутину, приостанавливается на yield
coroutine.resume(co, "Hello") -- Передает "Hello" в корутинуКогда корутина возобновляется во второй раз, "Hello" передается внутрь и становится возвращаемым значением coroutine.yield(), которое сохраняется в переменной value.
Попробуйте сами
function createEchoCoroutine(initialMessage)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов