lua 学习笔记—从数组开始
数组
数组大小范围不一定需要在声明是确定,可以改变
一维数组
例
> array = {"Lua", "lualu"}
> print(array[1])
Lua
> print(array[2])
lualu
> print(array[3])
nil
数组默认从1起始,但是用户可以设定,甚至可以从负数开始
> array = {}
> for i=-3,3 do array[i] = i*i end
> for i=-3,3 do
>> print(array[i])
>> end
9
4
1
0
1
4
9
多维数组
1.如下,需要数组中包含数组
array ={}
for i=-1,1 do
array[i] ={}
for j=-1,1 do
array[i][j]=i*j
end
end
for i=-1,1 do
for j=-1,1 do
print(array[i][j])
end
end
结果:
1
-0
-1
-0
0
0
-1
0
1
2.需要一维数组的索引键对应一个数组
array ={}
r=1
c=1
for i=-1,r do
for j=-1,r do
array[i*c+j]=i*j
end
end
for i=-1,r do
for j=-1,r do
print(array[i*c+j])
end
end
结果同上结果
迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。
泛型 for 迭代器
例
array = {"lua", "lualu","ooxx"}
for k,v in ipairs(array) do
print(k, v)
end
结果
E:\dyy\lua>lua main.lua
1 lua
2 lualu
3 ooxx
上例中 ipairs()为lua提供的迭代函数,for返回第一个nil是循环结束
Lua 的迭代器包含以下两种类型:
无状态的迭代器
多状态的迭代器
无状态的迭代器
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。
例:实现a到b-1的平方
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,2,-2
do
print(i,n)
end
结果
E:\dyy\lua>lua main.lua
-1 1
0 0
1 1
2 4
多状态的迭代器
最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到 table 内,将 table。作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在 table 内,所以迭代函数通常不需要第二个参数。
闭包类:
array = {"lua", "ooxx","lualu"}
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
结果
E:\dyy\lua>lua main.lua
lua
ooxx
lualu
ps:
pairs 和 ipairs区别
同:都是能遍历集合(表、数组)
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
table VS 数组:
local tab= {
[1] = "a",
[3] = "b",
[6] = "c"
}
for i,v in pairs(tab) do -- 输出 "a" ,"b", "c" ,
print( tab[i] )
end
for i,v in ipairs(tab) do -- 输出 "a" ,k=2时断开
print( tab[i] )
end
E:\dyy\lua>lua main.lua
a
c
b
a
local tabFiles = {"alpha", "beta", [3] = "no", ["two"] = "yes"}
for i,v in ipairs(tabFiles ) do --输出前三个 备注:因为第四个key不是整数
print( tabFiles [i] )
end
for i,v in pairs(tabFiles ) do --全部输出
print( tabFiles [i] )
end
end~~~