[]Lua数组
-
特点:
-
数组中的元素的数据类型是相同的。
-
索引以整数表示,索引起始值为1.
-
数组大小是不固定的。(不同于C中的数组,与python中的list类似。)
-
-
一维数组:
-
示例1:
-
arr = {"one", "two"}
-
for index = 0,2 do
-
print(arr[index])
-
-
end
-
-
结果1:依次输出nil, one, two。--输出nil的原因是,数组索引从1开始。
-
示例2:
-
arr = {}
-
for index = -2, 2 do
-
arr[index] = index * 2
-
-
end
-
-
结果2:依次输出:-4, -2, 0, 2, 4 --数组索引可以是负数。
-
-
多维数组:数组中包含数组。
[]Lua迭代器
-
定义:
-
迭代器(iterator):是一种对象,能够用来遍历标准模板库容器中的部分或全部元素;
-
每个迭代器对象代表容器中的确定的地址;
-
常常用函数来描述迭代器,每次调用该函数,就返回集合的下一个元素。
-
Lua中的迭代器包含以下两种类型:
-
无状态的迭代器。
-
多状态的迭代器。
-
-
-
泛型for迭代器:
-
特点:
-
泛型for在自己内部保存了:迭代函数、状态常量、控制变量。
-
泛型for迭代器提供了集合的key/value对。
-
-
语法:
-
for key, value in pairs(t) do
-
print(key, value)
-
-
end
-
说明:
-
key, value:变量列表。
-
pairs(t):表达式列表。
-
-
-
示例:
-
arr = {"one", "two"}
-
for key, value in ipairs(arr) do
-
print(key, value)
-
-
end
-
结果:依次输出: 1 one\n 2 two
-
说明:ipairs()是Lua提供的默认的迭代函数。
-
-
泛型for的执行过程:
-
初始化,计算in后面表达式的值。表达式返回泛型for需要的三个值:迭代函数、状态常量、控制变量。赋值过程与多赋值语句一样。
-
将状态常量和控制变量作为参数调用迭代函数。
-
将迭代函数的返回值,赋值给变量列表。
-
返回nil后,结束循环。
-
示例:
-
arr = {"one", "two", nil, "three"}
-
for key, value in ipairs(arr) do print(value) end
-
-
结果:依次输出one, two。--迭代函数返回nil后,循环结束,因此不会输出three。
-
-
返回第2步继续循环过程。
-
-
-
无状态的迭代器:
-
特点:
-
不保留任何状态的迭代器;
-
避免了创建闭包花费额外的代价;
-
-
最典型的例子是:ipairs()
-
示例(实现数字n的平方):
-
function square(iteratorMaxCount, currentNumber):
-
if (currentNumber < iteratorMaxCount)
-
then
-
currentNumber = currentNumber + 1
-
return currentNumber, currentNummber * currentNumber
-
-
end
-
-
end
-
for index, value in square, 3, 0 do print(value) end
-
-
结果:依次输出1, 4, 9
-
说明:square, 3, 0分别是泛型for中的迭代函数,状态变量,控制变量。
-
-
多状态的迭代器:
-
特点:不仅仅需要简单的状态常量和控制变量,还需要保存多个状态信息。
-
保存状态信息的方式:
-
闭包;
-
将状态信息保存到table内,将table作为迭代器的状态常量。
-
-
示例(闭包):
-
function elemIterator(collection)
-
local index = 0
-
local count = #collection --获取集合的元素个数
-
return function () --闭包函数;匿名函数,没有参数。
-
index = index + 1
-
if index <= count
-
then
-
return collection[index]
-
-
end
-
-
end
-
-
end
-
arr = {"one", "two", "three"}
-
for value in elemIterator(arr) do print(value) end
-
-
结果:依次输出one, two, three。
-
说明:
-
for循环运行前,elemIterator()先运行,返回闭包函数,作为迭代器函数;
-
for循环每次运行时,调用一次闭包函数。
-
-
-
ipairs和pairs和区别:
-
pairs: 迭代table,可以遍历表中所有的key可以返回nil。
-
ipairs: 迭代数组,不能返回nil,遇到nil则退出。
-