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)          --僅有一句調用
相關文章
相關標籤/搜索