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

确定表是否为空的最有效方法是什么(也就是说,当前既不包含数组样式的值,也不包含 dict- 样式的值) ?

目前,我使用的是 next():

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

还有更有效的方法吗?

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

100825 次浏览

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

测试空表的方法是使用0来测试计数器。

这是指向 元表文档的指针

不过,我确实喜欢你的解决方案,老实说,我不能假设我的解决方案总体上会更快。

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

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

为了获得最大的效率,您需要将 next绑定到一个局部变量,例如,

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

(当 next是本地的时候,代码通过对“ upvalue”数组进行常量索引操作来查找基元函数 nextnext保留全局值时,查找 next涉及索引“ Environment”散列表,该表包含全局变量的值。这个索引操作仍然是常量时间的,但是它明显慢于本地变量的数组查找。)

这可能就是你想要的:

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

我知道这张桌子很旧了,我可能误会你了,但如果你只是想让桌子空着,也就是说,除非你只是检查它是否空着,而你并不真的想要或者需要它是空着的,你可以通过简单地重新创建它来清除它,除非我弄错了。这可以用下面的语法完成。

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

如果重载,则更好地避免对 _ _ eq 求值。

if rawequal(next(myTable), nil) then
-- myTable is empty
end

或者

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

尝试蛇,为我工作

serpent = require 'serpent'


function vtext(value)
return serpent.block(value, {comment=false})
end


myTable = {}


if type(myTable) == 'table' and vtext(myTable) == '{}' then
-- myTable is empty
end

这个怎么样?

if endmyTable[1] == nil then
-- myTable is empty
end