确定Lua表是否为空(不包含条目)的最有效方法?

什么是最有效的方法来确定一个表是否为空(也就是说,当前不包含数组样式值或字典样式值)?

目前,我正在使用next()

 if not next(myTable) then -- Table is empty end 

有没有更有效的方法?

注意: #操作符在这里是不够的,因为它只对表中的数组样式值进行操作,所以#{test=2}#{}是无法区分的,因为两者都返回0.还要注意检查表variables是nil是不够的,因为我不是在寻找零值,而是有0个条目(即{} )的表。

你的代码是有效的,但错误的。 (考虑{[false]=0} 。)正确的代码是

 if next(myTable) == nil then -- myTable is empty end 

为了获得最大的效率,您需要将其绑定到本地variablesnext ,例如,

 ... local next = next ... ... if next(...) ... 

一种可能性是通过使用metatable“newindex”键来计算元素的数量。 当分配的东西不nil ,递增计数器(计数器也可以存在于元表中),当分配nil ,递减计数器。

testing空表将是用0testing计数器。

这是一个指向metatable文档的指针

尽pipe如此,我确实喜欢你的解决scheme,而且我也不能认为我的解决scheme总体上更快。

这可能是你想要的:

 function table.empty (self) for _, _ in pairs(self) do return false end return true end a = { } print(table.empty(a)) a["hi"] = 2 print(table.empty(a)) a["hi"] = nil print(table.empty(a)) 

输出:

 true false true 

我知道这是旧的,我可能会误解你,但是你只是希望桌子是空的,也就是说,除非你只是检查它是否是实际需要或者是不需要它是空的,除非我弄错了,否则只要重新创build就可以清除它。 这可以用下面的语法完成。

 yourtablename = {} -- this seems to work for me when I need to clear a table. 

尝试使用# 。 它返回表中的所有实例。 如果表中没有实例,则返回0

 if #myTable==0 then print('There is no instance in this table') end 
    Interesting Posts