我有一段非常简单的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
答案 0 :(得分:4)
这不是coroutine.wrap
的工作原理。您必须在第一次调用coroutine.yield
时传递enumerator
。