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
这是因为嵌套表也是元素,是会参与到长度的计算。