local function iterator(t)
local i = 0
local n = #t
return function()
i = i + 1
if i <= n then
return t[i]
end
end
end
local testTable = {"a","b","c"}
-- while中使用迭代器
local iter1 = iterator(testTable) --调用迭代器产生一个闭包
while true do
local element = iter1()
if nil == element then
break;
end
print(element)
end
for i, v in ipairs(testTable) do
print(i, v)
end
-- for中使用迭代器
for element in iterator(testTable) do --- 这里的iterator()工厂函数只会被调用一次产生一个闭包函数,后面的每一次迭代都是用该闭包函数,而不是工厂函数
print(element)
end
总结:
1:利用闭包实现iterator,iterator是一个工厂,每次调用都会产生一个新的闭包,该闭包内部包括了upvalue(t,i,n)
因此每调用一次该该闭包(共用upvalue),该闭包就会根据记录上一次的状态,以及返回table中的下一个元素
2:上例中的for element in iterator(testTable) do 中,在循环开始前iterator()工厂函数仅会被调用一次产生闭包,后面每次循环都用该闭包(不在调用iterator()工厂函数产生闭包),此与for i, v in ipairs(testTable) do都为泛型for循环。
并且此特性与数值for循环中的表达式在循环开始前进行一次性求值,之后不再进行求值 一致