lua 中的#和table.getn

本文介绍在Lua中如何正确获取数组与表的真实长度,包括处理含有nil元素的数组及非数组形式的表,并提供代码示例。

获取数组的长度

对于一个数组我们通常可以使用#和table.getn来获取其长度

tabletest = {1,2,3,5,7}
print(table.getn(tabletest))     ------》5
print(#tabletest)                ------》5

使用这两种方法都能得到这个数组的长度,但是如果

tabletest = {1,2,nil,3,5,7}
print(table.getn(tabletest))     ------》2
print(#tabletest)                ------》2

发现不能获得我们数组真正的长度,这是因为数组默认遇到nil便被判断为数组结束,所以最好不要用#和table.getn来获取包含有nil的数组长度

获取table的长度

对于table来说,如果他不是数组,我们使用#和table.getn是不能获取它的长度的

tabletest = {a=1,b=2,c=3,e=5,f=7}
print(table.getn(tabletest))     ------》0
print(#tabletest)                ------》0

我们可以使用pairs来获取

tabletest = {a=1,b=2,c=3,d=5,e=7}
local count=0
for k,v in pairs(tabletest) do
     count = count + 1
end
print(count)     ------》5

注意,判断一个table是否为空时,不能使用 if val == nil then因为table={}时不是空
可以使用next(val) ==nil来判断

uci_r:foreach("url_filter","url", function(section) list[#list+1] = uci_r:get_all("url_filter",section[".name"]) if not list[#list] then return false,err.ERR_COM_TABLE_ITEM_UCI_GET end --[[ret.list[#list] ={} ret.list[#list].usergroupname = list[#list].usergroupname ret.list[#list].action = list[#list].action ret.list[#list].filter_way = list[#list].filter_way ret.list[#list].filter_content = list[#list].filter_content ret.list[#list].target = list[#list].target ret.list[#list].worktime = list[#list].worktime ret.list[#list].comment = list[#list].comment ret.list[#list].enable = list[#list].enable ret.list[#list].urlgroupname = list[#list].urlgroupname]] ret[#list] = list[#list] ret[#list].src_type = list[#list].src_type if list[#list].src_type and list[#list].src_type == "network" then ret[#list].usergroupname = vnetZone2Name(list[#list].usergroupname) end ret[#list].action = list[#list].action ret[#list].filter_way = list[#list].filter_way list[#list].filter_content = list[#list].filter_content or "" list[#list].filter_content = type(list[#list].filter_content) == "table" and list[#list].filter_content or {list[#list].filter_content} ret[#list].filter_content = table.concat(list[#list].filter_content,"\r\n") if support_category == 1 then list[#list].content_filter = list[#list].content_filter or "" ret[#list].content_filter = type(list[#list].content_filter) == "table" and list[#list].content_filter or {list[#list].content_filter} ret[#list].content_filter = list[#list].content_filter list[#list].mode = list[#list].mode or "custom_urls" ret[#list].mode = list[#list].mode end ret[#list].target = list[#list].target ret[#list].time = list[#list].time ret[#list].comment = list[#list].comment ret[#list].enable = list[#list].enable ret[#list].urlgroupname = list[#list].urlgroupname ret[#list].max_num_per_rule = uci_r:get_profile("url_filter", "max_num_per_rule") or NUM_PER_RULE end )讲解一下
09-23
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值