定义协同函数
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