打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于判断table表的长度和为空操作问题
(很多地方和知识点都是参考过其他大神的和看手册综合而来的,不断进步和成长,感谢分享,不断奉献)
一、在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


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Lua1
Go 语言系列11:切片
03、指针数组和函数实现冒泡排序
[LUA学习笔记04]Lua语法(转)
Lua性能优化技巧
Lua脚本语言——Lua脚本基础语法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服