(很多地方和知识点都是参考过其他大神的和看手册综合而来的,不断进步和成长,感谢分享,不断奉献)
一、在lua中,经常求取table表的长度,通常的做法是使用取长度符号#,但有时候这是不准确的
比如:(lua版本为5.1)
测试代码
local arr = {1,2,3,["a"]=6}
local num = #arr
print("arr len="..#arr)
print("arr len="..table.getn(arr))
运行结果:
>lua -e "io.stdout:setvbuf 'no'" "TestLua.lua"
arr len=3
arr len=3
>Exit code: 0
解释:table.getn(t)等价于#t,计算的是数组元素,不包括hash键值,而且数组是以第一个nil元素来判断数组结束。
#只计算数组的元素个数,它实际上调用了对象的metatable的__len函数
table的长度是table为序列时的某个n,{1,2,...n} == table的所有数字索引,也就是说序列的数字索引必须连续。
table中间包括nil则不是序列,如arr = {10,20,nil,40},所以#arr得到的值并不能准确地反映table的元素个数。
查手册的原意是:针对非序列的表使用#,而那个table表又没有__len时得到的值无意义
我是用的是笨方法,只是有些消耗时间和内存,暂时没想到好方法。
测试代码
local arr = {1,2,nil,3,["a"]=6}
local function checkLen(tab)
if nil == tab or type(tab) ~= "table" then
return nil
end
local num = 0
for _,v in pairs(tab) do
if v then
num = num + 1
end
end
return num
end
print("arr len="..checkLen(arr))
运行结果:
>lua -e "io.stdout:setvbuf 'no'" "TestLua.lua"
arr len=4
>Exit code: 0
二、当table表为{}时,判断table表是否为空进行的操作
local arr = {}
判断方法(错误方法)
if arr == {} then
xxx--road_one
end
你会发现程序怎么也不进入road_one这行代码,原因:
{}相当于创建了一个表,只不过这个表的名字是匿名的,假设他的地址为newtab,则判断条件变成了arr和newtab的内存地址,所以判断结果始终返回false。
正确方法:
if next(arr) == nil then
xxxx--操作
end
原因:next获取表中的下一个内容,在空表中是没有下一个内容的,返回nil
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。