Lua old-style true iterator

  1. 云栖社区>
  2. 博客列表>
  3. 正文

Lua old-style true iterator

德哥 2016-03-28 17:28:13 浏览652 评论0

摘要: 老版本的Lua不支持for语句, 可以在函数中写循环来达到循环的目的.以下是书上的例子, 显然函数里面用了for, 所以有点毛病.> function allwords(f) >> for line in io.

老版本的Lua不支持for语句, 可以在函数中写循环来达到循环的目的.
以下是书上的例子, 显然函数里面用了for, 所以有点毛病.
> function allwords(f)
>>   for line in io.lines() do
>>     for word in string.gmatch(line, "%w+") do
>>       f(word)
>>     end
>>   end
>> end
-- 调用allwords函数, 使用print函数打印单词
> allwords(print)
hello nihao yes, now no
hello
nihao
yes
now
no

-- allwords传入一个匿名函数, 统计hello出现的次数
> do 
>> local count = 0
>> allwords( function (w) if w == "hello" then count = count +1 end end )
>> print(count)
>> end
hello, nihao, yes, hello
Hello, hello
3


allwords在generic for中的用法, 上一篇文章的例子
2. 使用closure的例子, 将状态值存储在closure中.
factory函数, 返回iterator匿名函数以及state状态值. state封装在iterator匿名函数中.
> function allwords()
>>    local state = {line = io.read(), pos = 1}  -- 使用factory函数的local变量表存储状态值, 对iterator来说就是non-local变量
>>    return function (state)
>>    while state.line do  -- 重复直到最后一行
>>      local s,e = string.find(state.line, "%w+", state.pos)  -- 查找单词
>>      if s then
>>        state.pos = e+1
>>        return string.sub(state.line, s, e)  -- 返回单词
>>      else  -- 否则下一行
>>        state.line = io.read()
>>        state.pos = 1
>>      end
>>    end
>>    return nil  -- 如果没有值, iterator函数返回nil给控制变量, 因此结束generic for循环.
>>  end, state
>> end

> for w in allwords() do
>>  print (w)
>> end
hello nihao a
hello
nihao
a

【云栖快讯】你想见的Java技术专家都在这了,向大佬提问,有问题必答  详情请点击

网友评论

德哥
文章1942篇 | 关注6174
关注
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、Po... 查看详情
阿里云总监课正式启航

阿里云总监课正式启航