一个 coroutine 用于在同一个脚本中同时执行多个任务。 此类任务可能包括从输入中生成值或在子程序上执行工作时解决更大的问题。 任务甚至不需要有定义的结束点,但它需要定义特定时间来让其他东西被工作在。
使用程序
通过提供 function 为 coroutine.create() 创建一个新的 coroutine 。一旦创建, coroutine 不会开始运行,直到第一个调用 Library.coroutine
local function task(...)
-- 这个函数可能会为一些工作,然后输出一些价值
coroutine.yield("first") -- 可以返回 coroutine.resume()
-- 函数在恢复后继续
return "second"
end
local taskCoro = coroutine.create(task)
-- 首次调用摘要,这会从开始运行函数
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> 是的,首先 (称为 coroutine.yield 的任务)
-- 继续运行函数直到它输出或停止
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
在 coroutine 的使用期间,您可以调用 coroutine.status() 来检查其状态:
<tbody><tr><td><b>暂停</b></td> <td>该程序正在等待恢复。程序在此状态下开始并在它们的函数调用 <code>coroutine.yield()</code> 时输入。</td></tr><tr><td><b>运行</b></td><td>匀例程正在运行。</td></tr><tr><td><b>普通</b></td> <td>该程序正在等待另一个程序的输出,也就是说,它已经重新启动了另一个程序。</td></tr><tr><td><b>死亡</b></td> <td>函数已停止运行(返回或抛出错误)。不能再使用 coroutine 了。</td></tr></tbody>
状态 | 意义 |
---|
包装子程序
当使用 coroutines 时,您还可以放弃使用 coroutine 对象,而且使用 wrap 函数。 此时,Wrap 函数会恢复特定 coroutine 当它被调用,并且只会返回已生成的值。 您可以使用 coroutine.wrap() 来实现此操作:
-- 创建协程并返回一个包装函数,它将它重新创建local f = coroutine.wrap(task)-- 将 coroutine 作为 if 调用 coroutine.resume()local result = f()-- 如果发生错误,它将被提高在这里!-- This differs from coroutine.resume() which acts similar to pcall()
第一个值从 coroutine.resume() 描述是否运行 coroutine 无错误。 但是由 coroutine.wrap() 返回的函数不会这么做:它们直接返回返回或传给 coroutine.yield() ,如果有错误发生在运行 coroutine 函数时,错误会在调用返回函数时发生。
生产者模式示例
想象一个产生重复单词的任务:每次它产生重复,下一个会产生一个更多。例如提供 Hello 会产生 Hello , HelloHello , 1> HelloHelloHello1> ,等等。 要这样做,您可以定义 4> peatThis4> :
-- 这个函数每次重启程序时重复一个字
local function repeatThis(word)
local repetition = ""
while true do
-- 执行一次重复,然后输出结果
repetition = repetition .. word
coroutine.yield(repetition)
end
end
要将此函数作为一个协程运行,您可以使用 coroutine.create() 之后的多个调用 coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- 真的,你好print(coroutine.resume(repetitionCoro)) -- 真的,你好print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
对于此生产器功能,您还可以使用 coroutine.wrap() 来获取生成值的函数:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- 您好print(f()) -- 你好print(f()) -- HelloHelloHello