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

Amb*_*ber 114 lua lua-table

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

目前,我正在使用next():

if not next(myTable) then
    -- Table is empty
end
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?

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

Nor*_*sey 140

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

if next(myTable) == nil then
   -- myTable is empty
end
Run Code Online (Sandbox Code Playgroud)

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

...
local next = next 
...
... if next(...) ...
Run Code Online (Sandbox Code Playgroud)

  • @Moberg 在运行时,全局变量需要哈希表查找,但`local` 变量只需要数组查找。 (5认同)
  • 为什么我们通过`local next`来获得速度? (3认同)
  • @HerlySQR 它不是更快,而是更正确。对于表“{[false]=0}”,“if not”将错过表不为空的一种情况,如答案中所述。`next()` 返回键,在该示例中为 `false`,而 `if not false` 会误导您认为表是空的。即使在这种情况下,“== null”方法也能正常工作。 (3认同)
  • 技术正确性的好点;在特定情况下,我一直在使用原始代码,`false` 不会是预期的键,所以 `if not` 工作正常,但我可能会养成与 `nil` 进行比较的习惯,而不是在未来,就像一个好习惯。是的,为了提高速度,我一直在将通用实用程序函数绑定到本地变量。感谢您的投入。 (2认同)
  • @Moberg这是由于LUA如何处理其命名空间.非常愚蠢的版本,它将首先爬上本地表,所以如果当前块中有一个`local next`,它将使用它,然后爬到下一个块,然后重复.一旦离开本地人,它将只使用全局命名空间.这是它的一个愚蠢的版本,但最终,它绝对意味着程序速度的差异. (2认同)