lua语言的协程中yield关键字可以挂起当前coroutine执行,并暂时存储临时变量值,该值即是第二次调用 resume 时传入的参数!
co = coroutine.create(function (value1,value2)
local tempvar3 =10
print("coroutine section 1", value1, value2, tempvar3)
local tempvar1 = coroutine.yield(value1+1,value2+1)
tempvar3 = tempvar3 + value1
print("coroutine section 2",tempvar1 ,tempvar2, tempvar3)
local tempvar1, tempvar2= coroutine.yield(value1+value2, value1-value2)
tempvar3 = tempvar3 + value1
print("coroutine section 3",tempvar1,tempvar2, tempvar3)
return value2, "end"
end)
print("main", coroutine.resume(co, 3, 2))
print("main", coroutine.resume(co, 12,14))
print("main", coroutine.resume(co, 5, 6))
print("main", coroutine.resume(co, 10, 20))
1.首先,我们创建了一个协程并将其赋给变量 co。此协程允许传入两个参数。
2.第一次调用函数 resume 时,协程内局部变量 value1 和 value2 的值分别为 3 和 2。
3.为了便于理解,我们使用了局部变量 tempvar3 该变量被初始化为 10。由于变量 value1 的值为3,所以 tempvar3 在随后的协程调用过程中被先后更新为 13 和 16。
4.第一次调用 coroutine.yield 时,为 resume 函数返回了值 4 和 3,这两个值是由传入的参数 3,2 分别加 1 后的结果,这一点可以从 yield 语句中得到证实。除了显示指定的返回值外,resume 还收到隐式的返回值 true,该值表示协程执行的状态,有 true 和 false 两个可能取值。
5.上面的例子中,我们还应该关注在下一次调用 resume 时如何为协程传入参数。从例子中可以看到,coroutine.yield 函数返回后为两个变量赋值,该值即是第二次调用 resume 时传入的参数。这种参数传递的机制让可以结合前面传入的参数完成很多新的操作。
6.最后,协程中所有语句执行完后,后面的调用就会返回 false 状态,同时返回 "cannot resume dead coroutine"消息。