恢复与让出
本课属于 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 变量中。
挑战
简单编写一个函数 createEchoCoroutine,接收 initialMessage,并返回一个字符串,展示主代码与协程之间的双向通信。
创建一个协程,先让它产出 initialMessage,然后在恢复运行时接收一个响应,最后再产出该响应。这个函数应演示如何向协程传出值,以及如何向协程传入值。
逻辑:
- 创建一个函数,让它产出
initialMessage,并保存此次产出的返回值 - 收到该值后,再将它产出
- 使用
coroutine.create()将此函数包装成协程 - 第一次恢复协程,以获取初始消息
- 第二次恢复协程,并传入
"Response" - 捕获第二次恢复时产出的值
- 返回一个符合此格式的字符串:
First: [first_yield]\nSecond: [second_yield]
参数:
initialMessage(字符串):协程首次产出的消息
返回值:一个字符串,展示两个产出的值,中间以换行符分隔(字符串)。格式:First: Hello\nSecond: Response
亲手试试
function createEchoCoroutine(initialMessage)
-- 在这里编写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器