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~~~