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

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

  • 相关阅读:
    坚决不再犯的脑残错误
    2018.8.21提高A&省选组模拟考试
    2018.10.9模拟考试
    fread()快读
    2018.10.6模拟考试
    2018.10.4模拟考试
    2018.8.20提高AB组模拟考试
    2018.8.21提高AB组模拟考试
    2018.8.19提高B组模拟考试
    2018.8.18提高B组模拟试题
  • 原文地址:https://www.cnblogs.com/back-to-the-past/p/15018200.html
Copyright © 2020-2023  润新知