Почему эта простая сопрограмма Lua не работает? - PullRequest
2 голосов
/ 03 июля 2010

У меня есть очень простой маленький кусочек кода 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

1 Ответ

4 голосов
/ 03 июля 2010

Это не так, как coroutine.wrap работает. Вы должны передать coroutine.yield при первом вызове enumerator.

...