加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【lua】table是否为空的判断

发布时间:2020-12-14 21:56:18 所属栏目:大数据 来源:网络整理
导读:在项目的脚本lua中经常有这样的需求, 1、local a = {} 2、对a进行处理 3、对a是否为空表进行判断 关于对a是否为空表的判断,如果直接这样做: if a == {} then 这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名tabl

在项目的脚本lua中经常有这样的需求,

1、local a = {}

2、对a进行处理

3、对a是否为空表进行判断

关于对a是否为空表的判断,如果直接这样做:

if a == {} then

这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。

也有些代码如此做:

if table.maxn(a) == 0 then

这样做也不保险,除非table的key都是数字,而没有hash部分。

难道真的要遍历table发现有东西就return false跳出才能断定它是否为空吗?这样做是可以的,至少目前项目中前人是这么封装的,不过代码太难看.?

网上小搜了一下,发现原来官方手册里早已经给了答案,那就是靠lua内置的next函数

即如此用:if next(a) == nil then

next其实就是pairs遍历table时用来取下一个内容的函数.

在项目的module中最好封装一下,免得module本地也有next函数

于是封装后判断的lua table是否为空的函数如下:

function table_is_empty(t)

??????? return _G.next( t ) == nil

end

不过呢,使用next也有注意事项,一并提一下。for循环pairs一个table就是使用的next实现,不过这个循环过程中,不能赋新的元素给table,不然结果就是未知的,不过你可以在循环的过程中改变已有的值,特别地,可以通过赋为nil来删除一个元素。

t = { [1] = 'a',[2] = 'b',[3] = 'c',[32] = 'df',[10] = 'm'}
START = 5
for k,v in pairs(t) do
    print(k,v)
    if k < START then
        t[k + START] = v
        t[k] = nil
    end
end

print('****************')
for k,v)
end

执行结果

next的文档说明如下:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读