Lua学习笔记7-table的长度获取

来源:互联网 发布:玫瑰花茶 知乎 编辑:程序博客网 时间:2024/05/17 23:29

table中长度获取可以使用#来实现,但如果table中有nil就会出现一些奇怪的现象,例如:

local tab ={    1,    nil,}print(#tab)
输出结果为:1

local tab ={    1,    nil,    2,    nil}print(#tab)

同样输出1

但是继续添加后

local tab ={    1,    nil,    2,    nil,    3}print(#tab)
输出结果就为5

再添加一个nil结果又变了

local tab ={    1,    nil,    2,    nil,    3,    nil}print(#tab)
结果输出变成了3

所以由上面就可以看出了,在table中加入nil元素是非常危险的,在使用table一定要注意不能加入nil元素。


Lua的table使用中,给一个元素赋值nil就等于删除它,其实这样做是存在危险的,比如使用ipairs迭代遍历就会有提前终止遍历的危险,所以删除table中的元素最好使用table.remove方法来实现。remove方法最大的好处是不会破坏table的有序性,如原有1...n的序列,如果给索引为2的元素赋值nil,则索引为2的地方就为nil,整个序列是“断”的。使用remove删除索引为2的元素后,后面的元素会统一往前移动,整个序列还是“连续”的。


关于table的长度计算中有一些特例,

tab = {1, 2, k1 = 33, 4}print(#tab)
得到的长度为3

主要是因为tab混合了列表(list)和记录(record)两种风格,表中k1=33是record风格,并且record是不作为外表的长度计算。

如果将程序改为,

tab = {1, 2, {k1 = 33}, 4}print(#tab)
则计算出的长度就为4

这是因为嵌套表也是元素,是会参与到长度的计算。

原创粉丝点击