使用 coroutine.yield() 暂停
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 50 课,共 54 课。
协程的真正强大之处在于
请注意,每次调用
coroutine.yield() 函数。它可以让协程在执行过程中暂停自身,并将控制权交还给恢复它的代码。当协程调用 coroutine.yield() 时,它会立即在该位置停止运行。下次你对这个协程调用 coroutine.resume() 时,它会从 yield() 调用之后继续运行,就像什么都没有发生一样。这是一个简单的示例:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- 输出 "One",然后暂停
coroutine.resume(co) -- 输出 "Two",然后暂停
coroutine.resume(co) -- 输出 "Three",然后结束resume() 时,都会运行协程,直到遇到 yield()。协程会准确记住停止的位置,包括所有局部变量和执行状态。你也可以在让出时传回值。传给 coroutine.yield() 的任何参数都会成为 coroutine.resume() 的返回值。请注意,coroutine.resume() 总会将布尔值 status 作为第一个返回值(如果协程运行时没有错误,则为 true;如果发生错误,则为 false),之后再返回传给 yield() 的任何值:function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status 为 true,value 为 10
local status, value = coroutine.resume(co)
print(value) -- 输出:10
-- status 为 true,value 为 20
status, value = coroutine.resume(co)
print(value) -- 输出:20挑战
简单编写一个函数 createYieldingCoroutine,它接收 count,并返回一个字符串,其中显示了协程多次让出值的输出。
创建一个协程,从第 1 步到 count,每一步都让出字符串 "Step X",总共执行 count 步。恢复协程 count 次,以收集所有让出的值。将所有让出的值用换行符连接后返回。
逻辑:
- 创建一个函数,使用循环依次让出
"Step 1"、"Step 2"等,直到count - 所有值都让出后,函数应当结束(不再为 "Done" 最后让出一个值)
- 使用
coroutine.create()将此函数包装在协程中 - 恢复协程
count次,并收集每次让出的值 - 用换行符连接所有让出的值
- 返回连接后的字符串
参数:
count(数字):要让出的步数
返回值:包含所有让出的值并用换行符分隔的字符串(字符串)。格式:Step 1\nStep 2\nStep 3
亲手试试
function createYieldingCoroutine(count)
-- 在这里编写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器