个人笔记,不对正确性负责,请看官自行斟酌。
前言
table是lua中非常重要的一种类型,有必要对其多了解一些。
1、获取table长度
一般有两种方法:
方法1,table.getn 或
使用#或者table.getn获取
这是一种比较简单的方法,但使用过程有许多局限性,主要体现在以下几个方面,如下:
t = {}
t[1] = 1
t[2] = 2
t[4] = 4
print(#t)
按道理说,应该输出的结果是3,但实际结果确是4,是不很反直觉?先不要急着思考,再看看这个例子:
t1 = {1,2,3,num4=4,num5=5}
print(#t1)
按一般直觉来说,这里应该输出5,但真的有那么简单吗?显然不是,而是3。为什么呢?因为#操作会从访问所有数字下标的元素,而且仅可以从1开始,中间必须连贯。因此这种方式只能用来操作数组类型的table,即不要设置key值,仅通过table.insert方法操作。
方法2,通过pairs遍历table,然后获取长度
对于字典类型的table,显然不能用上面的方法获取长度,要用一些其他的方法。看下面的例子
function countDictElements(dict)
local count = 0
for k,v in pairs(dict) do
count = count + 1
end
return count
end
local myDict = { key1 = "value1", key2 = "value2", key3 = "value3" }
print(countDictElements(myDict)) -- 输出表中的键值对数量
代码比较简单,就是通过遍历table的元素,然后挨个数过来。
2、pairs和ipairs区别
如果将获取字典长度方法中的pairs换乘ipairs,会发生什么?看下面一个例子
function countDictElements(dict)
local count = 0
for _ in ipairs(dict) do
count = count + 1
end
return count
end
local myDict = { key1 = "value1", key2 = "value2", key3 = "value3" }
print(countDictElements(myDict)) -- 输出表中的键值对数量
输出结果是:0
为什么呢?因为pairs会遍历table中所有的元素,而ipairs的功能类似于#或者table.getn,仅能遍历数字下标,key值必须连续。所以某种意义上说,上面的方法类似于一个#