function producer()
--定义生产的商品
local i = 0;
while i < 100
do
i = i + 1
print("produce :"..i)
--通过协程实现
coroutine.yield(i)
end
end
function consumer()
while true
do
local status, result = coroutine.resume(po)
print("consume:", result)
if(result == 99) then break
end
end
end
--这里必须是producer而不能是producer()
po = coroutine.create(producer)
consumer()
为什么coroutine.create的时候传方法名而不能传produer()
在 Lua 中,函数名和函数调用是两个不同的概念。当你使用 coroutine.create(producer)
时,你将函数名 producer
传递给了 coroutine.create
函数。这表示你想要创建一个协程对象来运行名为 producer
的函数。
而当你使用 coroutine.create(producer())
时,你实际上是在尝试调用函数 producer
,并将函数的返回值作为参数传递给 coroutine.create
函数。这可能会导致一些问题,因为 producer
函数内部使用了 coroutine.yield
函数,因此它返回的实际上是一个协程对象,而不是一个值。
因此,当你使用 coroutine.create(producer())
时,你会得到一个 "attempt to yield across metamethod/C-call boundary" 错误,因为你尝试从函数调用的边界内使用 yield
函数。
如果你要使用 coroutine.create
创建一个协程对象来运行 producer
函数,应该使用 coroutine.create(producer)
,而不是 coroutine.create(producer())
。
所以,将 po = coroutine.create(producer())
改为 po = coroutine.create(producer)
即可解决这个问题。