2017-07-02 11 views
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() 

答えて

2

これはバージョン間でさまざまな記述でエラーを出します。

+0

ありがとうございます!しかし、関数を呼び出さなければ、何らかの方法で引き続き引数を渡すことができますか? – rbeef

+0

さて、それらを '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