Lua数组
一维数组
array={"Lua","Java","C++"}
for i=0,2 do
print(array[i])
end
--[[
输出结果:
nil
Lua
Java
结果分析:
Lua索引值以1为起始,也可以指定0开始
]]
-- 以负数为数组索引值
array={}
for i=-2,2 do
array[i]=i*2
end
for i=-2,2 do
print(array[i])
end
多维数组
-- 初始化数组
array={}
for i=1,3 do
array[i]={}
for j=1,3 do
array[i][j]=i*j
end
end
-- 访问数组
for i=1,3 do
for j=1,3 do
print(array[i][j])
end
end
Lua迭代器
一种对象,能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。
在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素
泛型for迭代器
泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量
泛型for的执行过程
https://www.runoob.com/lua/lua-iterators.html
Lua迭代器类型
- 无状态的迭代器
- 多状态的迭代器
无状态的迭代器
不保留任何状态的迭代器,每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。如:ipairs
函数
多状态的迭代器
迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,方法:
- 使用闭包(类似于lambda表达式,该表达式能包含函数本身以及外部引用变量,外部引用变量类似于lambda表达式中
[]
内捕获的外部变量) - 将所有状态信息封装到table内
array={"Google","Apple"}
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
--[[
输出结果:
Google
Apple
]]
Lua table(表)
table是一种数据结构,可以用于创建不同的数据类型:数组、字典等
table的特点:
- 使用关联型数组,可以用任意非nil的类型作为数组的索引
- 大小不固定,可以根据需要扩容
- 可以用于解决模块(module)、包(package)和对象(Object)
table的构造
-- 初始化表
mytable={} -- 最简单的构造函数
-- 指定值
mytable[1]="Lua"
-- 移除引用
mytable=nil
-- Lua垃圾回收会释放内存
-- 注意:table间的赋值是传引用,两者指向同一个内存,只有当没有任何变量指向该内存(即所有table变量都指向了nil),Lua的垃圾回收机制才会清理相对应的内存
table操作
--[[
作用:列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开
参数列表:
table:操作对象
sep:分隔符
start:起始索引
end:末尾索引
返回值:连接后的字符串
]]
table.concat(table[,sep[,start[,end]]])
--[[
作用:在table的数组部分指定位置(pos)插入值为value的一个元素
参数列表:
table:操作对象
pos:插入位置,默认为数组部分的末尾
value:插入的值
返回值:
]]
table.insert(table,[pos,]value)
--[[
作用:删除table数组部分位于pos位置的元素,其后的元素会被前移
参数列表:
table:操作对象
pos:删除的元素位置,默认为最后一个元素的位置
返回值:删除的元素的值
]]
table.remove(table[,pos])
--[[
作用:对给定的table进行升序排序,数值按照数值大小,字符串按照首字母ASCCI码排序
参数列表:
table:操作对象
comp:比较方法,接收两个参数,返回一个布尔值,为true不交换,为false交换
返回值:nil
]]
table.sort(table[,comp])