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"消息。