Menu
CoddyTech

使用 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
challenge icon

挑战

简单

编写一个函数 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
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Lua 在线编译器