Menu
CoddyTech

恢复与让出

本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 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,并返回一个字符串,展示主代码与协程之间的双向通信。

创建一个协程,先让它产出 initialMessage,然后在恢复运行时接收一个响应,最后再产出该响应。这个函数应演示如何向协程传出值,以及如何向协程传入值。

逻辑:

  • 创建一个函数,让它产出 initialMessage,并保存此次产出的返回值
  • 收到该值后,再将它产出
  • 使用 coroutine.create() 将此函数包装成协程
  • 第一次恢复协程,以获取初始消息
  • 第二次恢复协程,并传入 "Response"
  • 捕获第二次恢复时产出的值
  • 返回一个符合此格式的字符串:First: [first_yield]\nSecond: [second_yield]

参数:

  • initialMessage(字符串):协程首次产出的消息

返回值:一个字符串,展示两个产出的值,中间以换行符分隔(字符串)。格式:First: Hello\nSecond: Response

亲手试试

function createEchoCoroutine(initialMessage)
    -- 在这里编写代码
end
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器