137

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

目前,我正在使用next()

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

有没有更有效的方法?

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

4

8 回答 8

183

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

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

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

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

(当next是本地时,代码next通过恒定时间索引操作将原始函数查找到“上值”数组中。当next是全局时,查找next涉及索引“环境”哈希表,其中包含全局变量的值。此索引操作仍然是恒定时间的,但它比查找局部变量的数组要慢得多。)

于 2009-08-10T01:14:35.293 回答
2

如果重载,最好避免评估 __eq。

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

或者

if type(next(myTable)) == "nil" then
   -- myTable is empty
end
于 2018-12-03T17:43:43.573 回答
1

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

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

这是指向元表文档的指针

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

于 2009-08-10T01:12:13.223 回答
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
于 2012-04-11T22:34:55.737 回答
-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
于 2019-05-18T19:29:52.400 回答
-3

这个怎么样 ?

if endmyTable[1] == nil then
  -- myTable is empty
end
于 2019-05-31T19:53:04.927 回答
-3

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

yourtablename = {} -- this seems to work for me when I need to clear a table.
于 2016-05-04T12:31:59.803 回答
-7

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

if #myTable==0 then
print('There is no instance in this table')
end
于 2017-01-04T02:03:08.930 回答