代码之家  ›  专栏  ›  技术社区  ›  Martin

为什么这个简单的Lua连体衣不起作用?

  •  2
  • Martin  · 技术社区  · 14 年前

    我有一段非常简单的Lua代码,它是我在自学协程如何工作时编写的。

    我一直都很好,直到我去了紧身衣。 spec 国家:

    紧身衣(F)

    使用body f创建新的协同程序。 f必须是Lua函数。返回A 恢复协同程序的函数 每次打电话。任何论点 传递给函数的行为与 要继续的额外参数。返回 resume返回的值相同,但 第一个布尔值。如果出现错误, 传播错误。

    但是,本规范:

    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
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   lhf    14 年前

    不是这样 coroutine.wrap 作品。你必须通过 coroutine.yield 在第一次呼叫中 enumerator .