Domanda

Ho un semplice piccolo pezzo di codice Lua, che ho scritto io stesso, mentre l'insegnamento come co-routine di lavoro.

Sono stato bene fino a quando ho avuto modo di coroutine.wrap, il spec stati:

  

coroutine.wrap (f)

     

Crea un nuovo coroutine, con il corpo f.   f deve essere una funzione Lua. Restituisce un   funzione che riprende il coroutine   ogni volta che viene chiamato. qualsiasi argomento   passato alla funzione si comportano come il   argomenti extra per riprendere. Restituisce il   valori stessi restituiti da riprendere, tranne   il primo booleano. In caso di errore,   propaga l'errore.

Tuttavia questo codice:

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)

lamenta che il rendimento è pari a zero (sulla linea ho segnato sopra). Da quanto ho capito, il rendimento dovrebbe essere il secondo argomento passato in coroutine.wrap, in modo da dove sto andando male?

soluzione davvero evidente, grazie alla risposta qui sotto

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

Soluzione

Non si tratta di come funziona coroutine.wrap. Devi passare coroutine.yield nella prima chiamata al enumerator.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top