1
私はLuaを学び、単純なコルーチンを作成しようとしています。 Lua 5.1では、以下のコードはエラーを示しています: "metamethod/C呼び出しの境界を越えて降伏しようとする"私はその制限について読んだことがあり、それが私のコードにどのように適用されるのかわかりません。私はLua 5.2でそれを試して、 "コルーチン外から降ろそうとしました"と私にも同じように混乱しています。答えは恥ずかしいほど明白だと私は確信しています!あなたはLuaの単純なコルーチンの混乱の問題
if co == nil then
co = coroutine.create(subLoop())
subLoop
を呼び出す代わりに、これはあなたがメインの状態/( - really-ない)コルーチンからyield
しようとし、その結果coroutine.create
if co == nil then
co = coroutine.create(subLoop)
にそれを渡している
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()
ありがとうございます!しかし、関数を呼び出さなければ、何らかの方法で引き続き引数を渡すことができますか? – rbeef
さて、それらを 'coroutine.resume'に渡し、' coroutine.yield'から抜け出す(または最初の 'resume'の通常の引数として)。したがって、 'f = coroutine.create(function(...)local args = {...}; trueの場合、args = {coroutine.yield(table.unpack(args)}} end end)'は、 'resume(f、" foo ") - >" foo "'、 'resume(f、23、42) - > 23,42というように。 – nobody