确定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