Menu
Coddy logo textTech

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.

challenge icon

Задание

Легко

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

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

Все уроки раздела Logic & Flow