【lua】table是否为空的判断

【lua】table是否为空的判断,第1张

概述在项目的脚本lua中经常有这样的需求, 1、local a = {} 2、对a进行处理 3、对a是否为空表进行判断 关于对a是否为空表的判断,如果直接这样做: if a == {} then 这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。 也有些代码如此做: if table.maxn(a) == 0 then 这样做

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

1、local a = {}@H_419_7@

2、对a进行处理@H_419_7@

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

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

if a == {} then@H_419_7@

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

也有些代码如此做:@H_419_7@

if table.maxn(a) == 0 then@H_419_7@

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

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

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

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

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

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

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

function table_is_empty(t)@H_419_7@

        return _G.next( t ) == nil@H_419_7@

end@H_419_7@

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

@H_419_7@

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

@H_419_7@

执行结果@H_419_7@

@H_419_7@@H_419_7@

next的文档说明如下:@H_419_7@

@H_419_7@@H_419_7@ 总结

以上是内存溢出为你收集整理的【lua】table是否为空的判断全部内容,希望文章能够帮你解决【lua】table是否为空的判断所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存