Menu
Coddy logo textTech

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.

challenge icon

Задание

Легко

Напишите функцию 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком