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

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

目前,我正在使用next()

if not next(myTable) then
    -- 表格为空
end

还有更有效的方法吗?

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

原文链接 https://stackoverflow.com/questions/1252539

点赞
stackoverflow用户101616
stackoverflow用户101616

一种可能的方法是使用元表中的“newindex”键计算元素数量。当分配不为 nil 的内容时,增加计数器(计数器也可以在元表中),当分配 nil 时,减少计数器。

检查空表将使用计数器为0进行检查。

这是指向元表文档的指针:metatable documentation

我确实喜欢你的解决方案,而且我也不能假设我的解决方案在总体上更快。

2009-08-10 01:12:13
stackoverflow用户41661
stackoverflow用户41661

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

if next(myTable) == nil then
   -- myTable 是空的
end

为了达到最大的效率,你应该将 next 绑定到一个局部变量上,例如,

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

(当 next 是局部变量时,代码通过常数时间的索引操作访问一个“upvalues”数组中的原始函数 next。当 next 是全局变量时,要找到 next 就要在“环境”哈希表中索引,其中包含了全局变量的值。这个索引操作仍然是常数时间,但比局部变量的数组查找要慢得多。)

2009-08-10 01:14:35
stackoverflow用户1327727
stackoverflow用户1327727

这可能是您想要的:

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-11 22:34:55
stackoverflow用户6284567
stackoverflow用户6284567

我知道这篇文章已经过时了,也许我有些地方理解不正确,但是如果你只是想清空表格,那么你可以通过简单地重新创建表格来清空它,除非你只是想检查它是否为空,而不是真正地希望或需要它为空,除非我理解有误。可以使用以下语法来完成。

yourtablename = {} --当我需要清空一个表格时,这个方法对我是有效的。
2016-05-04 12:31:59
stackoverflow用户6763451
stackoverflow用户6763451

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

如果 #myTable==0 then
print('此表中没有实例')
end
2017-01-04 02:03:08
stackoverflow用户10740269
stackoverflow用户10740269

建议避免对 __eq 进行重载的评估。

if rawequal(next(myTable), nil) then
   -- myTable 为空
end

或者

if type(next(myTable)) == "nil" then
   -- myTable 为空
end
2018-12-03 17:43:43
stackoverflow用户9155965
stackoverflow用户9155965
尝试使用 serpent,适用于我
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-18 19:29:52
stackoverflow用户1596551
stackoverflow用户1596551

如果 endmyTable[1] 为空,则执行以下操作:

-- myTable is empty
2019-05-31 19:53:04