Lua的协程
Lua通过调用coroutine.create(function)创建一个协程。一个协程有4个状态,suspended,running,normal,和dead。可以使用coroutine.status(co)来判断一个协程的状态,默认一个协程刚被创建出来时,它的状态是suspended:
co = coroutine.create(function() print("hi") end)
print(coroutine.status(co)) --> suspended
可以使用coroutine.resume(co)来启动一个协程,使其进入running状态,协程执行完毕之后,就会变成dead状态:
coroutine.resume(co) --> hi
print(coroutine.status(co)) --> dead
yield函数用来暂停一个协程的执行,coroutine.resume函数会执行到yield处暂停返回,第一个返回值为true说明没有发生错误,其他返回值是传给yield的参数:
local co = coroutine.create(function(a, b)
print("hi")
coroutine.yield(a + b, a - b)
end)
print(coroutine.resume(co, 20, 10))
运行结果如下:
类似地,yield函数会在resume调用之后返回,然后继续执行协程,返回值为传给resume的参数:
local co = coroutine.create(function(a, b)
print("hi")
print(coroutine.yield(a + b, a - b))
end)
coroutine.resume(co, 1, 2)
coroutine.resume(co, 20, 10)
运行结果如下:
当然,当协程执行完毕时,协程的返回值将作为resume函数的返回值返回:
local co = coroutine.create(function(a, b)
print("hi")
print(coroutine.yield(a + b, a - b))
return "hello coroutine"
end)
print(coroutine.resume(co, 1, 2))
print(coroutine.resume(co, 20, 10))
运行结果如下:
通过使用resume和yield,我们可以在不断执行resume的过程中了解协程内部的状态(通过yield函数携带的参数),相应地,在不断resume的过程中,也能在协程不同的阶段传递不同的参数给协程内部(通过resume函数携带的参数)。
如果你觉得我的文章有帮助,欢迎关注我的微信公众号(大龄社畜的游戏开发之路)-