Lua基础:迭代器

迭代器:迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素

  1. function list_iter(t)          --迭代器,返回元素值
  2.     local i=0
  3.     local n=table.getn(t)
  4.     return function()
  5.         i=i+1
  6.         if i<=n then return t[i] end
  7.     end
  8. end
  9. ----------------------------------------------------------
  10. t={10,20,30}
  11. iter=list_iter(t)
  12. while true do            --while语句使用迭代器
  13.     local element=iter()
  14.     if element==nil then break end
  15.     print(element)
  16. end
  17. --------------------------------------------------------
  18. for element in list_iter(t) do   --for语句使用迭代器
  19.     print(element)
  20. end
  21.  

无状态的迭代器:是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

  1. a={"one","two","three"}
  2. for i,v in ipairs(a) do
  3.     print(i,v)
  4. end
  5. -------------------------------------------------------------------
  6. function iter(a,i)
  7.     i=i+1
  8.     local v=a[i]
  9.     if v then
  10.         return i,v
  11.     end
  12. end
  13. function ipairs(a)
  14.     return iter,a,0
  15. end

多状态的迭代器:迭代器需要保存多个状态信息,将所有的状态信息封装到 table 内,将 table作为迭代器的状态常量

  1. local iterator
  2.  
  3. function allwords()
  4.     local state={line=io.read(),pos=1}
  5.     return iterator,state
  6. end
  7.  
  8. function iterator(state)
  9.     while state.line do
  10.         local begin_index,end_index=string.find(state.line,"%W+",state.pos)
  11.         if begin_index then
  12.             state.pos=end_index+1
  13.             return string.sub(state.line,begin_index,end_index)
  14.         else
  15.             state.line=io.read()
  16.             state.pos=1
  17.         end
  18.     end
  19.     return nil
  20. end

迭代器接受一个函数作为参数,并且这个函数在迭代器内部被调用。

  1. function allwords(f)
  2.     for l in io.lines("56.txt") do
  3.         f(l)                            --调用print函数
  4.     end
  5. end
  6. allwords(print)                --传入print函数作为参数
  7.  

猜你喜欢

转载自blog.csdn.net/QQhelphelp/article/details/88058463