协程趣事

lua-users home
wiki

本页展示了一些使用协程的技巧。

使用协程反向打印字符串

以下示例反转字符串。它使用协程和递归实现(没有使用表格)。

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 扩展,它们就可以正常运行(参见邮件列表以了解当前可用性)。


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2008 年 9 月 17 日下午 12:47 GMT (差异)