我正在学习Lua并尝试创建一个简单的协程。在Lua 5.1中,下面的代码给出了错误:"尝试跨metamethod / C-call边界产生。"我已经了解了这个限制,但我无法看到它如何应用于我的代码。我在Lua 5.2中尝试了它并且尝试从协同程序外部产生#34;这对我来说同样令人困惑。我确定答案会非常明显!
output = {}
done = false
function mainLoop()
while not done do
if co == nil then
co = coroutine.create(subLoop())
elseif coroutine.status(co) == "suspended" then
print(output[k])
coroutine.resume(co)
elseif coroutine.status(co) == "dead" then
done = true
end
end
end
function subLoop()
for k=1, 20 do
table.insert(output, "This is line " .. k .. " of the test output")
coroutine.yield()
end
end
mainLoop()
答案 0 :(得分:2)
您正在呼叫subLoop
if co == nil then
co = coroutine.create(subLoop())
而不是将其传递给coroutine.create
if co == nil then
co = coroutine.create(subLoop)
这导致您尝试从主状态/(非真实)协程yield
,这会在不同版本中出现不同描述的错误。