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函数携带的参数)。

如果你觉得我的文章有帮助,欢迎关注我的微信公众号(大龄社畜的游戏开发之路-

原文地址:https://www.cnblogs.com/back-to-the-past/p/15018200.html