Lua 七 协程

定义协同函数

coroutine.create(
	function (a,b)
	print(a+b)
	end
)

注意里面是括号包围的

通过resume进行调用:

--创建协程
co = coroutine.create(
	function (a,b)
	print(a+b)
	end
)

coroutine.resume(co,1,2)

resume 既可以当做启动,也可以当做继续运行

写两个函数比较麻烦,如果为了直接创造并启动,可以用wrap

co = coroutine.wrap(
	function (a,b)
	print(a+b)
	end
)

co(20,3)

输出23

 

暂停继续操作:再调用一次resume,会执行yield后面的

co = coroutine.create(
	function (a,b)
	print(a+b)
	coroutine.yield()
	print(a-b)
	end
)

coroutine.resume(co,2,3)
print("i am good")

coroutine.resume(co)

最下面这个resume,可以带上2,3参数,也可以不带。

注意啦 注意啦:

a,b = coroutine.resume(co,2,3) 也是可以的,如果调用成功,a为true,b是如果这个create有返回值return

的话,会给后面的b,c,d,。。。哈哈

co = coroutine.create(
	function (a,b)
	return a+b,a-b
	end
)

re,res1,res2 = coroutine.resume(co,2,3)
print(re,res1,res2)

coroutine.resume(co)

输出:>lua -e "io.stdout:setvbuf 'no'" "ceshi.lua" 
true    5    -1
>Exit code: 0

如果有yield的时候呢,暂停的话,返回值可以在yield中传递即yield(a+b,a%b)

 

 

另外再添加一个例子吧:

function foo(a)
	print("foo", a)
	return coroutine.yield(2 * a)
end

co = coroutine.create(function ( a, b )
	print("co-body", a, b)
	local r = foo(a + 1)
	print("r:"..r)
	print("co-body", r)
	local r, s = coroutine.yield(a + b, a - b)
	print("co-body", r, s)
	return b, "end"
end)

print("main1", coroutine.resume(co, 1, 10))
print("main2", coroutine.resume(co, "mi"))
print("main3", coroutine.resume(co, "x", "y"))
print("main4", coroutine.resume(co, "x", "y"))

输出:

>lua "coroutine.lua"
co-body	1	10
foo	2
main1	true	4
r:mi
co-body	mi
main2	true	11	-9
co-body	x	y
main3	true	10	end
main4	false	cannot resume dead coroutine
>Exit code: 0

我一直不理解的是co-body    mi

没有搞懂mi是怎么传递过来的。哇,抓狂。

 

重点是第一行最后一句,我翻译的是,如果协程被yield挂起的时候,resume重新运行的时候,参数val1.。。。。会被作为yield的返回值传递给它。所以foo的return的返回值就是mi了 然后r就是mi了

其实就是一个思路::coroutine.resume()函数的参数会作为coroutine.yield()函数的返回值,仅当yield挂起的时候,调用coroutine.resume()会传递yield的返回值。coroutine.yield()函数的参数,会作为coroutine.resume()函数的返回值

 

再提供一个lua中文版吧,仅建议参考,因为有一些翻译,可能不是所有人都理解

https://cloudwu.github.io/lua53doc/manual.html#pdf-math.maxinteger

 

再提供官网原版:

http://www.lua.org/manual/5.3/manual.html#6.4

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值