协程趣事 |
|
以下示例反转字符串。它使用协程和递归实现(没有使用表格)。
do local wrap, yield = coroutine.wrap, coroutine.yield local function putrev(w) if w then putrev(yield()) io.write(w) end end function prevchar(s) local p = wrap(putrev) p"\n" string.gsub(s, ".", p) p() end -- don't look at this one until you understand the first one function prevword(s) local p = wrap(putrev) local function q(a, b) p(a) p(b) end p"\n" string.gsub(s, "(%S+)(%s*)", q) p() end end > prevchar "This is a test" tset a si sihT > prevword "This is a test" test a is This >
-- RiciLake
以下是两种使用协程进行控制反转的不同方法
for k in coroutine.wrap(function() table.foreach(_G, coroutine.yield) end) do print(k) end table.foreach(_G, coroutine.wrap(function(k) print(k) for k in coroutine.yield do print(k) end end))
可惜,两者都不适用于标准 Lua。找出真正的原因,你就会豁然开朗。或者直接获取 Coco 或 RVM 扩展,它们就可以正常运行(参见邮件列表以了解当前可用性)。