table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下:

(1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串;

(2).table 的默认初始索引一般以 1 开始;

(3).table 的变量只是一个地址引用,对 table 的操作不会产生数据影响;

(4).table 不会固定长度大小,有新数据插入时长度会自动增长;

(5).table 所有索引值都需要用 “[“ 和 ”]” 括起来;如果是字符串,还可以去掉引号和

中括号; 即如果没有[]括起,则认为是字符串索引;

(6).table 所有元素之间,总是用逗号 “,” 隔开;

先来定义个简单table来看一下,老规矩不废话上代码如下;




lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法


我们用代码验证了:

定义的table表_tab里面的元素可以是“字符串”也可以是“数字”。

直接输出_tab是一个地址

table 的下标索引一般以 1 开始;

接下来我们在来验证一下table不会固定长度大下,在这之前我们先来介绍一下table的常用函数,lua提供了一些辅助函数来操作table,例如insert、remove等。

废话不说上代码如图下:


lua_newtable嵌套用法 lua的table添加元素_lua table insert_02


代码验证根据输出得到一下结论:

函数table.insert将一个元素插入到指定位置:用法在代码里面注释的已经很清楚了。根据输出打印也能很直观的看到结果,就不过多的去解释了

根据插入的元素改变了表的长度这就验证了table 不会固定长度大小,有新数据插入时长度会自动增长。我之前写过一篇“lua获取table的长度”结合着一起看,这里可以验证这一说法


lua_newtable嵌套用法 lua的table添加元素_数组_03


如过说我在插入元素的时候不指定位置会怎么样?上代码如图下:


lua_newtable嵌套用法 lua的table添加元素_数组_04


代码验证:

insert的第二个参数是可以省略的,这样就会插入到数组的最后,从而不必移动其他元素。

这个时候我们来扩展一下,我能将一个元素插入到指定的位置上。那我能不能通过某个元素获取它所在的位置,答案是肯定当然可以。我之前写过“如何获取一个数组元素位置”可以去看一下


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_05


有插入insert就会有删除remove,下面上remove代码:


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_06


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_06


代码验证:

table.remove是从数组中移除(并返回)一个元素,table.remove(_tab,1)将移除_tab中下标是1的元素,如果不指定移除位置,则移除最后一个。 打印的输出已经非常详细了没什么好多说的了。

知道了如何移除,那我要想清空一个表该怎么办?难道要用一个循环一个个去移除啊,当然不用这么麻烦了。简单到你想不到:上代码如下:


lua_newtable嵌套用法 lua的table添加元素_字符串_08


代码验证:

直接_tab={}或者_tab=nil

清空的意思是把表里的所有东东都清空吧? 直接={}就行。

关于内存占用这个问题不用担心,lua的垃圾回收机制会在下次gc时把引用计数为0(就是原先)的table在内存中自动清除。

是不是简单到你都没有想到?哈哈哈

让我们继续向下进行吧

另一个有用的函数是sort,对数组进行排序,如果没有提供排序函数,默认是<操作。这里不仅仅是数,对字符串也有效。

table.sort() 话不多说代码如下:


lua_newtable嵌套用法 lua的table添加元素_lua table insert_09


代码验证:

如何有新人看不懂这个for循环先不要管它,你只要知道table.sort()将表排序了就可以,至于for循环等等之后再去整理介绍,这里主要介绍table。

大家会发现这个正序,那有没有倒序呢?答案是肯定的,当然有。这里不过多强调后面我会针对如何获得最大数,最小数,正序,倒序,等等拿出一本篇幅专门去整理。这里主要还是介绍table。

刚才说了数字可以排序,字符串也可以排序。上代码


lua_newtable嵌套用法 lua的table添加元素_字符串_10


代码验证:

是可以排序的,我没有骗人。

好累,不过还是要继续!

table.maxn()

含义:table.maxn()函数返回指定table中所有正数key值中最大的key值。 如果不存在key值为正数的元素, 则返回0。 此函数不限于table的数组部分。

上代码:


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_11


代码验证:

从输出打印中应该可以很直观的看到结果,有一点要清楚是key的最大值,不是元素的。

table一些简单的介绍就先介绍到这里,下面给大家简单的介绍一下我在游戏开发中的一些使用,要学会更要会用!

废话不多说上代码:


lua_newtable嵌套用法 lua的table添加元素_lua table insert_12


从函数名就能看出来,这是一个游戏数据类。里面随意写了一个table表。添加到了init函数里。我把init函数给您粘贴出来如下:


lua_newtable嵌套用法 lua的table添加元素_lua table insert_13


init函数很简洁明了,传一个表进来,插入到self._root里面去。就干了这事。(self._root = {};也是一张表)

如何使用呢:

代码如下:


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_14


马上把setIndexValue()和getIndexValue()代码奉上:


lua_newtable嵌套用法 lua的table添加元素_lua table insert_15


这只是一种简单的用法,告诉你了如何使用。可以演变出好多用法,这就要靠自己了。

在最后在来介绍一下这个table.concat() 函数

格式:table.concat(table, sep, start, end)

concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长。

有朋友留言说如果把表里的所有key值打印出来,接下来咱们就来实现一下。


lua_newtable嵌套用法 lua的table添加元素_lua_newtable嵌套用法_16


代码验证:

通过输出打印出来,第一个输出就打印了所有,后面就根据需求具体打印。

输出打印和代码应该没什么可说的了,已经很直观。就是不知道我对给我留言的朋友提出的那个问题理解的对不对了。如果理解对了这个方法就可以。如果我理解的不对可能就没有达到那位朋友的预期,也深感抱歉。

写了好多啊,肯定不是很全,也漏掉了一些关于table表的相关知识。不管怎么说吧继续努力,今后查漏补缺吧。