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

时间:2009-08-09 22:56:50

标签: lua lua-table

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

目前,我正在使用next()

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

有更有效的方法吗?

注意:#运算符在这里不够用,因为它只对表中的数组样式值进行操作 - 因此#{test=2}#{}无法区分,因为它们都返回0。另请注意,检查表变量是否为nil是不够的,因为我没有查找nil值,而是查找包含0个条目的表(即{})。

8 个答案:

答案 0 :(得分:130)

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

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

为了获得最高效率,您需要将next绑定到本地变量,例如

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

答案 1 :(得分:1)

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

测试空表将是用0来测试计数器。

这是指向metatable documentation

的指针

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

答案 2 :(得分:0)

这可能是你想要的:

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

答案 3 :(得分:0)

这个怎么样?

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

答案 4 :(得分:-1)

我知道这已经过时了,我可能会以某种方式误解你,但你只是希望桌子是空的,也就是说,除非你只是检查它是否是你真的不想或不需要它是空的,你可以通过简单地重新创建它来清除它,除非我弄错了。这可以使用以下语法完成。

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

答案 5 :(得分:-1)

最好避免在重载时评估__eq。

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

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

答案 6 :(得分:-1)

尝试蛇,为我工作

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

答案 7 :(得分:-5)

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

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