我如何获得在Lua的哈希表中的密钥数量?

myTable = {} myTable["foo"] = 12 myTable["bar"] = "blah" print(#myTable) -- this prints 0 

我实际上是否必须遍历表中的项目来获取密钥的数量?

 numItems = 0 for k,v in pairs(myTable) do numItems = numItems + 1 end print(numItems) -- this prints 2 

我尝试了#操作符和table.getn()。 我认为table.getn()会做你想要的,但事实certificate,它返回的值与#相同,即0.它看起来,字典插入nil占位符是必要的。

循环使用键和计算它们似乎是获得字典大小的唯一方法。

表t的长度被定义为使得t [n]不为零并且t [n + 1]为零的任何整数索引n; 而且,如果t [1]是零,那么n可以是零。 对于一个规则的数组,非零值从1到给定的n,它的长度正好是n的最后一个值的索引。 如果数组有“空洞”(也就是其他非零值之间的零值),那么#t可以是任何直接在零值之前的索引(也就是说,它可以认为任何这样的零值作为结束的arrays)。 所以只有获得长度的方法是迭代它。

除了手动迭代按键之外,通过元方法自动跟踪它很简单。 考虑到你可能不想跟踪你所做的每一个表,你可以写一个函数,让你把任何表转换成一个可以键值对象。 以下是不完美的,但我认为这将说明这一点:

 function CountedTable(x) assert(type(x) == 'table', 'bad parameter #1: must be table') local mt = {} -- `keys` will represent the number of non integral indexes -- `indxs` will represent the number of integral indexes -- `all` will represent the number of both local keys, indxs, all = 0, 0, 0 -- Do an initial count of current assets in table. for k, v in pairs(x) do if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1 else keys = keys + 1 end all = all + 1 end -- By using `__nexindex`, any time a new key is added, it will automatically be -- tracked. mt.__newindex = function(t, k, v) if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1 else keys = keys + 1 end all = all + 1 t[k] = v end -- This allows us to have fields to access these datacounts, but won't count as -- actual keys or indexes. mt.__index = function(t, k) if k == 'keyCount' then return keys elseif k == 'indexCount' then return indxs elseif k == 'totalCount' then return all end end return setmetatable(x, mt) end 

使用这个例子包括:

 -- Note `36.35433` would NOT be counted as an integral index. local foo = CountedTable { 1, 2, 3, 4, [36.35433] = 36.35433, [54] = 54 } local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true } local foobar = CountedTable { 1, 2, 3, x = 'x', [true] = true, [64] = 64 } print(foo.indexCount) --> 5 print(bar.keyCount) --> 4 print(foobar.totalCount) --> 6 

现场工作示例

希望这有助于! 🙂

Lua将表存储为两个分开的部分:一个散列部分和一个数组部分,len运算符只处理数组部分,意味着由一个数值索引的值,再加上使用下面提到的规则,所以你没有任何select的计数您需要使用pairs()函数遍历表的“哈希”值。