Lua学习笔记(8)

  今天学习第七章:迭代器与泛型forweb

7. Iterators and the generic for
1)迭代器与闭包:
     迭代器是一种指针类型的结构,能够遍历集合里的每一个元素。
     在Lua中,经常使用上一章提到的返回函数来实现迭代器。
     迭代器在泛型for中,能够很方便的访问全部内容,如:
     function list_iter(t)
          local i = 0
          local n = table.getn(t)
          return function()
               i = i+1
               if i <= n then return t[i] end
           end
     end
     访问用:
      t = {10,20,30}
     iter = list_iter(t)
     或者:
     for item in list_iter(t) do .... end

2)泛型for的语义:
     for <var-list> in <exp-list> do
          <body>
     end
     执行过程:
     (1)初始化,计算 <exp-list>,返回迭代函数、状态常量、控制变量
     (2)状态量和控制量做为参数,调用迭代函数
     (3)返回值赋值给<var-list>
     (4)返回nil则结束循环,不然返回(2)

3)无状态迭代器:
     指迭代器不保留任何状态(用闭包实现),如table的迭代器ipairs:
     for i, v in ipairs(a) do ... end

4)多状态迭代器:
     指状态常量、控制变量等保存在迭代器内部(用内部的表或函数递归实现),迭代函数不须要有状态量和控制变量的参数。
     好处:能够作到更精确的控制迭代器工做。
     坏处:开销大。

5)另外一种迭代器方式:
     上述的迭代器,都是返回出当前的访问值,由外部for循环调用。
     另外一种方式,是将for循环分装在迭代器内部,经过函数名做为传入参数,完成迭代工做。
     相比较而言,方式一更灵活,外部的for能提供更多的操做方式,而方式二更简洁,调用流程更清晰,以下所示:
     方式一:
a = {10,20,30}

function list_iter(a)
     local i = 0
     local n = table.getn(a)
    
     return function()
          i = i+1
          if i <= n then return a[i] end
     end
end

for item in list_iter(a) do     --用for方式调用
     print(item)
end
     
     方式二:
          a = {10,20,30}
          function list_iter(a, func)
               for i, v in ipairs(a) do func(v) end
          end
          list_iter(a,print)          --仅有一句调用
相关文章
相关标签/搜索