Lua old-style true iterator

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

Lua old-style true iterator

德哥 2016-03-28 17:28:13 浏览606 评论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

用云栖社区APP,舒服~

【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入!  详情请点击

网友评论