Lua学习笔记(8)

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

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)          --仅有一句调用

你可能感兴趣的:(学习,lua,笔记)