任何一種結構,只要允許你遍歷集合中所有元素的都可稱之為迭代器。lua中常常使用函數來描述迭代器,每次調用該函數都返回集合的下一個元素。每一個迭代器都需要保存一些狀態來知道當前處于什么位置和如何進行下一次迭代。對于這樣的任務,閉包提供了很好的機制來完成。一個典型的閉包結構包含兩個函數:一個是閉包自身,一個是創建閉包的工廠。
例如,我們可以寫過簡單的list迭代器,讓他僅僅返回值。
tb = {33, 44, 55}
for v in values(tb) do
print(v)
end
上面的迭代器有個瑕疵:需要創建一個閉包。創建閉包是需要代價的,只是大部分情況下都沒問題,然而有些情況卻是不能容忍這個代價的。這時的解決方法是使用泛型for。泛型for本身保存迭代狀態,包括迭代函數,狀態常量,控制變量,因此不必付出閉包的代價,稱這種迭代器為無狀態迭代器。
泛型for的語法:
執行過程:
1.初始化迭代函數,狀態常量,控制變量,不足補nil,多出忽略。
2.狀態常量,控制變量作為參數調用迭代函數。
3.將迭代函數返回的值付給變量列表。
4.如果返回的第一個值為nil,則循環結束,否則執行循環體。
5.回到第2步。
如果遇到需要保存多個狀態,還有種方法是將所有狀態封裝到表中。實際上,我們不推薦這么寫。因為創建閉包的代價比創建表的要小,而且lua處理閉包的速度更快些。還有更強大更復雜的方式是使用協同來創建迭代器。
新聞熱點
疑難解答