Lua_表结构_007

来源:互联网 发布:网络连接异常 编辑:程序博客网 时间:2024/06/05 07:33

在Lua中的table类似C#中的字典,其实就是一个key-value键值对的数据结构。


常用的方法

1   table.concat (table [, sep [, start [, end]]]):concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。2   table.insert (table, [pos,] value):在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.3   table.maxn (table)指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了)4   table.remove (table [, pos])返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。5   table.sort (table [, comp])对给定的table进行升序排序。 

这里写图片描述
【注意】第二种方式创建的时候键不可以是字符串,值可以是任意的数据类型
这里写图片描述


表的遍历

不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。
这里写图片描述
这里写图片描述


数组

在lua中通过整数下标访问表中的元素即可简单的实现数组。数组不必事先指定大小,大小可以随需要动态的增长。例:    a = {}             -- new array    for i=1, 4 do           a[i] = 0    end    a[5] = 1    for i,v in ipairs(a) do        print(i,v)    end

扩展

扩展:如果表的valuefunction,遍历表并执行每一个functionfunction fun()endt = {}t["key1"] = funfor k in pairs(t) do      t[k]()end

注意事项

1、可以把这个类型看作数组;
2、可以用任意类型来做数组索引,除了nil;
3、所有元素之间,总是用”,”隔开;
4、所有索引值都需要用”[”和”]”括起来;如果是字符串还可以去掉引号和中括号;
6、在构造函数的最后的“,”是可选的,可以方便以后的扩展。如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编排。


表相关的函数

myTable = {"aa","bb","cc","ff","GG"}--把表中所有数据连成一个字符串  适用于数组类型的表结构 不适用于字典类型的表结构print("concat:" .. table.concat(myTable))--在表中索引为3的位置插入一个数据table.insert(myTable,3,"pp")--默认是在表的末尾添加一个数据table.insert(myTable,"yy")print("insert:" .. table.concat(myTable))--删除指定下标的元素table.remove(myTable,4)print("remove:" .. table.concat(myTable))--如果不指定删除的下标 默认删除表的末尾table.remove(myTable)print("remove:" .. table.concat(myTable))--按照ASCII码的顺序排序table.sort(myTable)print("sort:" .. table.concat(myTable))

运行结果:
concat:aabbccffGG
insert:aabbppccffGGyy
remove:aabbppffGGyy
remove:aabbppffGG
sort:GGaabbffpp


面向对象实现

Enemy={}local this=Enemy;Enemy.hp=100;Enemy.speed=50;Enemy.move=function()print("move")endfunction Enemy.attact()print("attact")print(this.hp)endEnemy.attact();