最近由于工作需要,要开始学习Lua,开始简单入门。
Lua迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址
在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。
泛型for迭代器
泛型for在自己内部保存迭代函数,实际上保存三个值:迭代函数、状态常量、控制变量。
变量列表中第一个变量为控制变量,其值为nil时循环结束。
下面是语法格式:
for k,v in pairs(t) do //ipairs是Lua默认提供的迭代函数
print(k,v)
end
无状态的迭代器
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中利用无状态迭代器可以避免创建闭包花费额外的代价。
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
这种无状态迭代器的典型的简单的例子是ipairs,它遍历数组的每一个元素。
实现 数字 n 的平方:
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n) //1 1
//2 4
//3 9
end
多状态的迭代器
迭代器需要保存多个状态信息而不是简单的状态常量和控制变量。最简单的方式是使用闭包,还有就是将状态信息封装到table中,将table作为状态常量。
array = {"Lua", "Tutorial"}
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