现在的位置: 首页 > 综合 > 正文

Lua程序设计之协同

2013年10月22日 ⁄ 综合 ⁄ 共 956字 ⁄ 字号 评论关闭

转自http://blog.csdn.net/avenccssddnn/article/details/7931160

LUA协同程序当中,resume-yield可以用来传递交换信息


情况一:

1.1当协同程序主函数没有参数时,如:

c = coroutine.create(function() print 'ONE' end)

用resume时,传入除c协同对象外,还有其他参数,其他参数将被忽略。
coroutine.resume(c,xx)
1.2当协同程序主函数有参数a,b时,如:

c = coroutine.create(function(a,b) print a..'ONE' .. b end)

调用resume时传入参数a,b时,a,b被传入主函数内
coroutine.resume(c,a,b) -- 打印a ONE b
情况二:

在讲之前,我们讲一下resume的返回值,resume函数采用了前面讲过的保护模式,即实现包含在pcall函数之内,所以其返回失败格式:false error info 返回成功 true + 协同主函数内return返回值,或者是yeild函数的返回值
如果协同程序主函数中调用了yield函数

2.1当yield函数有参数时,如时resume传入了多余参数,yeild的参数将被作为resume的返回值,举例如下

c = coroutine.create(function(a,b) coroutine.yeild(a+b,a*b) end)

print(coroutine.resume(c,1,2)) -- true 3,2 (说明1+2=3,1*2 =2)
2.2当yield函数没有参数时,如时resume传入了多余参数,所有多余参数将被作为resume的返回值,举例如下

c = coroutine.create(function(a,b) coroutine.yeild() end)

print(coroutine.resume(c,1,2)) -- true 1,2
情况三:

协同主函数内并没有调用yeild函数,只包含return 语句时,举例如下:

c = coroutine.create(function() return "hellor" end)
print(coroutine.resume(c)) --true hellor 返回值被resume当作返回值

抱歉!评论已关闭.