Answers:
您的代码有效,但是错误。(考虑{[false]=0}
)。正确的代码是
if next(myTable) == nil then
-- myTable is empty
end
为了获得最大效率,您需要绑定next
到局部变量,例如,
...
local next = next
...
... if next(...) ...
local next
?
local next
当前块中有一个,它将使用该表,然后爬到下一个块,然后重复。一旦离开本地,它将仅使用全局命名空间。这是它的精简版,但是最后,它绝对意味着程序速度上的差异。
一种可能性是通过使用元表“ newindex”键来计算元素的数量。当没有分配东西时nil
,增加计数器(计数器也可以存在于元表中),而在分配时nil
,减少计数器。
测试空表将测试计数器为0。
这是指向元文档的指针
我确实喜欢您的解决方案,但老实说,我不能认为我的解决方案总体上更快。
nil
分配时间,因为如果表中已经存在键,则__newindex不会触发。
__index
和__newindex
,将实际数据存储在影子表中,并使实际表为空,以便__index
将其完全调用。大声考虑,我怀疑每次查找的增加成本都不值得。
这可能是您想要的:
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
next()
比循环遍历更有效(更简洁)pairs()
。
pairs()
是基本上只是使用next()
技术,但更多的开销。
table
不建议写入标准库。
如果过载,最好避免对__eq的求值。
if rawequal(next(myTable), nil) then
-- myTable is empty
end
要么
if type(next(myTable)) == "nil" then
-- myTable is empty
end
尝试使用#
。它返回表中的所有实例。如果表中没有实例,则返回0
if #myTable==0 then
print('There is no instance in this table')
end
#
在这里还不够,并给出了原因。您能解释一下为什么会绕开这些原因吗?
false
这不是预期的密钥,因此可以正常if not
工作,但是将来我可能会养成一个习惯,即与之进行比较nil
。是的,我一直在将通用实用程序功能绑定到本地var以提高速度。感谢您的输入。