--lua中迭代器理解
--[[ 首先,初始化,计算 in 后面表达式的值,
表达式应该返回泛型 for 需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用 nil 补足,多出部分会被忽略。
第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
第三,将迭代函数返回的值赋给变量列表。
第四,如果返回的第一个值为nil循环结束,否则执行循环体。
第五,回到第二步再次调用迭代函数--]]
local function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
--square迭代函数
--5是状态常量
--0是控制变量
for i, n in square, 5, 0 do
print(i,n)
end
print("test1------end----------")
--iteratorFunc迭代函数
--3是状态常量
--execCount是控制变量
local execCount = 0
local iteratorFunc = function(iteratorObj, key)
if execCount >= 3 then
return nil --执行第4次时结束循环
end
execCount = execCount + 1
local a1 = execCount
local a2 = execCount + 100
local a3 = execCount + 200
return a1, a2, a3
end
for a1, a2, a3 in iteratorFunc do
print(a1, a2, a3)
end
print("test2------end----------")
local t = {1,2,3}
print(ipairs(t)) -- function table index
for index, value in ipairs(t) do
print(index,value)
end
print("test3------end----------")
--多状态的迭代器:很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包;这样的迭代函数不需要控制变量这个参数
local array = {"Google", "Runoob"}
local function elementIterator (collection)
local index = 0
local count = #collection
-- 闭包函数
return function ()
index = index + 1
if index <= count then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end