设为首页 加入收藏

TOP

Lua基础 generic for
2014-11-24 07:37:40 来源: 作者: 【 】 浏览:0
Tags:Lua 基础 generic for

下面写一下怎么给genericfor 写迭代器。


1. 迭代器和闭包


在Lua中,迭代器用function表示,每次调用该function,都会返回集合中的next元素。


每个迭代器都要在连续的调用之间保存一些state,这样才能知道进行到哪一步,下一步该从哪开始处理。在Lua中,闭包可以处理这个问题。闭包结构包含两个function:一个是闭包本身,另一个是factory,用来创建闭包。下面是个简单的示例:


function values(t)
local i = 0
return function () i = i + 1; return t[i] end
end


在上面的例子中,values是factory。每次调用factory,都会创建一个新的闭包(迭代器本身)。该闭包在变量t和i中保存state。每次调用这个迭代器,都会从t中返回next元素的值。返回最后一个元素后,它会返回nil,标志着迭代器结束。


可以将上面的迭代器用在while 中,但是用genericfor 更简单:


t = {10, 20, 30}



function value(t)
local i = 0
return function () i = i + 1; return t[i] end
end



iter = value(t)
while true do
local element = iter()
if element == nil then break end
print(element)
end



t = {1, 2, 3}
for element in value(t) do
print(element)
end


执行结果如下:



genericfor 为迭代器循环过程在内部保存state,不需要iter变量;每次迭代都调用该迭代器,并在迭代器返回nil时停止循环。


下面是一个复杂点的例子,从当前输入的文件中遍历所有的word。遍历过程中保存两个值:当前行(变量line),当前位置(pos),string.find 函数从当前行中搜索一个word,用'%w+'匹配,在匹配到word后,将当前位置pos置于该word之后的第一个字符处,并返回该word。否则,迭代器读入一个新行再重复上面的过程。如果没有更多的行,返回nil,标志迭代结束。


function allwords ()
local line = io.read()
local pos = 1
print("allwords begin")
return function ()
while line do
local s, e = string.find(line, "%w+", pos)
if s then
pos = e + 1
print("return the word")
return string.sub(line, s, e)
else
print("read next line")
line = io.read()
pos = 1
end
end
print("return nil, iter end")
return nil
end
end


for word in allwords() do
print(word)
end


执行结果如下:



注意执行打印出来的一些信息,可以帮助了解脚本的执行过程。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android自定义Toast 下一篇System.nanoTime与System.current..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)