Lua中简单的协程令人困惑的问题

时间:2017-07-02 01:58:34

标签: lua runtime-error coroutine

我正在学习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()

1 个答案:

答案 0 :(得分:2)

您正在呼叫subLoop

    if co == nil then
      co = coroutine.create(subLoop())

而不是将其传递给coroutine.create

    if co == nil then
      co = coroutine.create(subLoop)

这导致您尝试从主状态/(非真实)协程yield,这会在不同版本中出现不同描述的错误。