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来判断

这段Lua脚本的主要功能是将`list`表的最后一个元素的部分属性复制到`ret`表的最后一个元素中,并对某些属性进行处理赋值。 以下是对脚本逐行功能的详细分析: 1. `ret[#list] = list[#list];`:将`list`表的最后一个元素复制到`ret`表的最后一个位置。 2. `ret[#list].src_type = list[#list].src_type;`:将`list`表最后一个元素的`src_type`属性赋值给`ret`表最后一个元素的`src_type`属性。 3. `if list[#list].src_type and list[#list].src_type == "network" then ret[#list].usergroupname = vnetZone2Name(list[#list].usergroupname); end;`:如果`list`表最后一个元素的`src_type`属性存在且值为`"network"`,则调用`vnetZone2Name`函数对`usergroupname`属性进行处理,并将结果赋值给`ret`表最后一个元素的`usergroupname`属性。 4. 后续的一系列赋值语句,如`ret[#list].action = list[#list].action;` 等,将`list`表最后一个元素的`action`、`filter_way`、`websubmit`等属性依次赋值给`ret`表最后一个元素的对应属性。 5. `list[#list].filter_content = list[#list].filter_content or "";`:如果`list`表最后一个元素的`filter_content`属性不存在,则将其赋值为空字符串。 6. `list[#list].filter_content = type(list[#list].filter_content) == "table" and list[#list].filter_content or {list[#list].filter_content};`:如果`list`表最后一个元素的`filter_content`属性不是表类型,则将其转换为包含该属性值的表。 7. `ret[#list].filter_content = table.concat(list[#list].filter_content,"\r\n");`:将`list`表最后一个元素的`filter_content`表中的元素用`"\r\n"`连接成字符串,并赋值给`ret`表最后一个元素的`filter_content`属性。 8. `if support_category == 1 then ... end;`:如果`support_category`的值为`1`,则对`list`表最后一个元素的`content_filter``mode`属性进行处理,并将处理结果赋值给`ret`表最后一个元素的对应属性。 9. 后续的赋值语句,如`ret[#list].target = list[#list].target;` 等,将`list`表最后一个元素的`target`、`time`、`comment`等属性依次赋值给`ret`表最后一个元素的对应属性。 10. `ret[#list].max_num_per_rule = uci_r:get_profile("url_filter", "max_num_per_rule") or NUM_PER_RULE`:从`uci_r`对象中获取`"url_filter"`配置文件的`"max_num_per_rule"`属性值,如果获取失败,则使用`NUM_PER_RULE`作为默认值,并将其赋值给`ret`表最后一个元素的`max_num_per_rule`属性。 ### 代码示例 ```lua -- 假设 list、ret、vnetZone2Name、uci_r、support_category、NUM_PER_RULE 已经定义 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; ret[#list].websubmit = list[#list].websubmit; 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 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值