为什么这个简单的Lua协程不起作用?

时间:2010-07-03 01:21:51

标签: multithreading lua coroutine

我有一段非常简单的Lua代码,我在教自己如何协同工作时写的。

我很好,直到我到了coroutine.wrap,spec州:

  

coroutine.wrap(f)

     

使用body f创建一个新的协同程序。   f必须是Lua函数。返回一个   恢复协程的功能   每次被召唤。任何争论   传递给函数的行为就像   要恢复的额外参数。返回   恢复返回的相同值,除了   第一个布尔值。如果有错误,   传播错误。

但是这段代码:

Enumeration = {}

Enumeration.Create = function(generator)
    return coroutine.wrap(generator, coroutine.yield)
end

local function TestEnumerator(yield)
    yield(1) --ERROR HERE
    yield(2)
    yield(3)
end

local enumerator = Enumeration.Create(TestEnumerator)
local first = enumerator()
local second = enumerator()
local third = enumerator()

print (first, second, third)

抱怨收益率为零(在我上面标明的行上)。据我了解,yield应该是传递给coroutine.wrap的第二个参数,所以我哪里错了?

非常明显的解决方案,感谢下面的答案

Enumeration.Create = function(generator)
    local iter = coroutine.wrap(generator, coroutine.yield)
    return function()
        return iter(coroutine.yield)
    end
end

1 个答案:

答案 0 :(得分:4)

这不是coroutine.wrap的工作原理。您必须在第一次调用coroutine.yield时传递enumerator