如何获得Lua表中的entry数?

Lua#运算符和table.getn只能在密钥数为整数的情况下,算出entry数:

tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl))   -- prints "1     1"

count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count)            -- prints "2"

我如何能够不用依次查数,就可以得到所有的entry数?

原问题:How to get number of entries in a Lua table?

阅读 5.9k
2 个回答

答:u0b34a0f6ae
(最佳答案)
你已经找到了问题的解决办法,唯一的方法就是用pairs(..)迭代(iterate)整个表:

function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

而且,#运算符的定义不够全面,因此,还需要进行如下设定:

t = {1,2,3}
t[5] = 1
t[9] = 1

答:ergosys
你可以建立一个meta-table来统计entry的数目,这种方法比较使用于需要频繁使用这种结果的情况。


答:kikito
我的方法可能有些复杂,就是使用额外的变量来统计数,每添加一个数就增加这个变量:

count = 0
tbl = {}

tbl["test"] = 47
count = count + 1

tbl[1] = 48
count = count + 1

print(count)   -- prints "2"

通过设置metatable的__len来改变默认的计数方法,代码如下

t = {
    [1] = 0,
    [2] = 2,
    [5] = 999,
    xxx = 3,    
}
print(#t)
mt = {}
setmetatable(t, mt)
mt.__len = function ( params )
    local count = 0
    for k,v in pairs(params) do
        count = count + 1
    end
    return count
end
print('+----------------')
print(#t)

输出如下:
2
+----------------
4
[Finished in 0.0s]
参考出处:http://www.codingnow.com/2000/download/lua_manual.html#2.8

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进