一、迭代器的定義
“迭代器”就是一種可以遍歷一種集合中所有元素的機制。在Lua中迭代器以函數的形式表示,即沒掉用一次函數,即可返回集合中的“下一個”元素。迭代器的實現可以借助於閉合函數實現,閉合函數能保持每次調用之間的一些狀態。


上例while迭代需要保存一個迭代器iterator來保證每次獲取下一個值,而借助於泛型for則省去了這一步。泛型for會在開始迭代時先創建運行一次迭代器,然后再把值傳遞給v變量。
二、泛型for及無狀態的迭代器
上述的迭代器每個新的循環都要創建一個新的閉合函數。這樣的開銷在某些情況下就會不太容易接受了,然而希望能通過泛型for的自身來保存迭代器狀態。
泛型for保存狀態的機制在循環的過程中保存了迭代器函數。實際上保存着3個值:迭代器函數、恆定狀態、控制變量。
無狀態的迭代器:自身不保存任何值狀態,每次通過for循環將三種狀態值傳遞進去獲得返回值,返回值將在下次循環時繼續傳入無狀態迭代器。


三、具有復雜狀態的迭代器
迭代器的實現:
1、最簡單的方法就是使用閉合函數。
2、借助泛型for三種狀態值的無狀態迭代器。
3、將迭代器所需的所有狀態打包為table,保存在恆定狀態中。
迭代器通過一個table保存任意多的數據,還能在循環過程中改變這些數據,然而在循環過程中恆定狀態中是同一個table。因此,由於這種迭代器可以在恆定狀態中保存所有的數據,所以它可以忽略泛型for提供的第二個參數(控制變量)。


盡可能的嘗試編寫無狀態的迭代器,無狀態的迭代器將所有的狀態都保存在泛型for中,不需要在開始循環時創建任何新的對象。如果無法使用無狀態迭代器,那就就使用閉合函數創建迭代器。閉合函數實現的迭代器要比table的迭代器更為高效。(因為創建一個閉合函數要比創建一個table更廉價,其次訪問非局部的變量也比table字段更快)。