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) --僅有一句調用