coroutine.resume方法如果调用失败(调用状态为dead的协程会导致失败),那么返回false,并且带上一句"cannot resume dead coroutine"
以下代码进行测试:
function yieldReturn(arg) return arg end
co_yieldtest = coroutine.create(
function()
print("启动协程状态"..coroutine.status(co_yieldtest))
print("--")
coroutine.yield()
coroutine.yield(1)
coroutine.yield(print("第3次调用"))
coroutine.yield(yieldReturn("第4次调用"))
return 2
end
)
print("启动前协程状态"..coroutine.status(co_yieldtest))
print("--")
for i = 1,6 do
print("第"..i.."次调用协程:", coroutine.resume(co_yieldtest))
print("当前协程状态"..coroutine.status(co_yieldtest))
print("--")
end
coroutine.resume方法如果调用成功,那么返回true,如果有yield方法,同时返回yield括号里的参数;如果失败,那么返回false,并且带上一句"cannot resume dead coroutine"
以下代码进行测试:
co_yieldtest = coroutine.create(
function()
coroutine.yield()
coroutine.yield(1)
return 2
end
)
for i = 1,4 do
print("第"..i.."次调用协程:", coroutine.resume(co_yieldtest))
end
2068Lua 协同程序(coroutine)
挂起协程: yield 除了挂起协程外,还可以同时返回数据给 resume ,并且还可以同时定义下一次唤醒时需要传递的参数。
执行结果(结果中 true 表示本次调用成功):
2067Lua 协同程序(coroutine)
coroutine.creat方法只要建立了一个协程 ,那么这个协程的状态默认就是suspend。使用resume方法启动后,会变成running状态;遇到yield时将状态设为suspend;如果遇到return,那么将协程的状态改为dead。
coroutine.resume方法需要特别注意的一点是,这个方法只要调用就会返回一个boolean值。
coroutine.resume方法如果调用成功,那么返回true;如果有yield方法,同时返回yield括号里的参数;如果没有yield,那么继续运行直到协程结束;直到遇到return,将协程的状态改为dead,并同时返回return的值。
coroutine.resume方法如果调用失败(调用状态为dead的协程会导致失败),那么返回false,并且带上一句"cannot resume dead coroutine"
以下代码进行测试:
输出:
2066Lua 协同程序(coroutine)
coroutine.resume方法需要特别注意的一点是,这个方法只要调用就会返回一个boolean值。
coroutine.resume方法如果调用成功,那么返回true,如果有yield方法,同时返回yield括号里的参数;如果失败,那么返回false,并且带上一句"cannot resume dead coroutine"
以下代码进行测试:
输出:
2065Lua 协同程序(coroutine)
coroutine.creat方法和coroutine.wrap需要特别注意的是这个返回值的类型,功能上有些类似,但并不完全一样。
coroutine.creat返回的是一个协同程序,类型为thread,需要使用coroutine.resume进行调用;而coroutine.wrap返回的是一个普通的方法(函数),类型为function,和普通function有同样的使用方法,并且不能使用coroutine.resume进行调用。
以下代码进行测试:
输出:
2064Lua 协同程序(coroutine)
这一章的例子较难理解,如果把yield()和resume()两个函数的行为描述清楚了,就好理解多了。
例子再简化一下: