resume и yield
Часть раздела Логика и управление потоком путешествия по Lua на Coddy — урок 51 из 54.
В предыдущем уроке вы узнали, как coroutine может передавать значения обратно в основной код с помощью coroutine.yield(). Но связь может работать в обоих направлениях. Вы также можете передавать значения into coroutine, когда возобновляете её.
Когда вы вызываете coroutine.resume() с дополнительными аргументами после объекта сопрограммы, эти аргументы передаются в coroutine. Внутри сопрограммы эти значения становятся возвращаемыми значениями вызова 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, затем получает ответ при возобновлении (resume), и, наконец, возвращает этот ответ обратно. Функция должна продемонстрировать передачу значений как из сопрограммы, так и в нее.
Логика:
- Создайте функцию, которая возвращает через
yieldзначениеinitialMessageи сохраняет возвращаемое значение от этогоyield - После получения значения верните его обратно через
yield - Оберните эту функцию в сопрограмму с помощью
coroutine.create() - Возобновите работу сопрограммы в первый раз, чтобы получить начальное сообщение
- Возобновите работу сопрограммы во второй раз, передав
"Response" - Зафиксируйте значение, полученное от второго возобновления
- Верните строку в формате:
First: [first_yield]\nSecond: [second_yield]
Параметры:
initialMessage(string): Сообщение, которое сопрограмма вернет черезyieldпервым
Возвращаемое значение: Строка, показывающая оба возвращенных значения, разделенных новой строкой (string). Формат: First: Hello\nSecond: Response
Попробуйте сами
function createEchoCoroutine(initialMessage)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов