У меня есть очень простой маленький кусочек кода Lua, который я написал, пока учил себя, как работают сопрограммы.
Я был в порядке, пока не попал в coroutine.wrap, состояния spec :
coroutine.wrap (f)
Создает новую сопрограмму с телом 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 равен нулю (в строке, которую я отметил выше).Насколько я понимаю, yield должен быть вторым аргументом, передаваемым в coroutine.wrap, так где я ошибаюсь?
Действительно очевидное решение, благодаря ответу ниже
Enumeration.Create = function(generator)
local iter = coroutine.wrap(generator, coroutine.yield)
return function()
return iter(coroutine.yield)
end
end