原理一样,本质都是协程。但是前者function*
是“生成”生成器的函数,需要调用它才能得到生成器,而后者coroutine.create()
返回的已经是协程了;前者调用之时可以通过参数往里传值,所以第一次next()
无需再传,而后者必须通过第一次resume()
传递。例如下面两段等效的JS和Lua代码:
function* generator(a) {
console.log(a);
console.log(yield);
console.log(yield);
}
let gen = generator(1);
gen.next();
gen.next(2);
gen.next(3);
local co =
coroutine.create(
function(a)
print(a)
print(coroutine.yield())
print(coroutine.yield())
end
)
coroutine.resume(co, 1)
coroutine.resume(co, 2)
coroutine.resume(co, 3)
输出都一样,都是
1
2
3
话说如果Lua设计成coroutine.create(fn, ...)
,就和JS差不多了。