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

我有一小段非常简单的 Lua 代码,当我自学 coroutine 的时候编写了它。

当我到达 coroutine.wrap 时,规范表明:

coroutine.wrap (f)

创建一个新的 coroutine,它有一个 f 的主体。 f 必须是 Lua 函数。返回一个函数, 每次它被调用时,恢复 coroutine。 传递给该函数的任何参数都对应于 resume 时额外的参数。返回与 resume 返回的相同的值,除了第一个布尔值。在出错的情况下,向上传播错误。

然而,这段代码:

Enumeration = {}

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

local function TestEnumerator(yield)
    yield(1) -- 在此处出现错误
    yield(2)
    yield(3)
end

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

print (first, second, third)

抱怨 yield 是 nil(我已经标记的那一行)。据我所知,yield 应该是传入 coroutine.wrap 的第二个参数,那么我错在哪里了?

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

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

原文链接 https://stackoverflow.com/questions/3169946

点赞
stackoverflow用户107090
stackoverflow用户107090

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

2010-07-03 01:27:54