Самый эффективный способ определить, является ли таблица Lua пустой (не содержит записей)?

Какой наиболее эффективный способ определить, является ли таблица пустой (то есть в настоящее время не содержит значений типа массива или значений стиля dict)?

В настоящее время я использую next():

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

Есть ли более эффективный способ?

Примечание. Оператору # здесь недостаточно, так как он работает только со значениями стиля массива в таблице. Таким образом, #{test=2} неотличим от #{}, потому что оба возвращают 0. Также обратите внимание, что проверка того, table nil не хватает, поскольку я не ищу значения nil, а таблицы с 0 элементами (т.е. {}).

Ответ 1

Ваш код эффективный, но неправильный. (Рассмотрим {[false]=0}.) Правильный код

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

Для максимальной эффективности вы хотите привязать next к локальной переменной, например,

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

Ответ 2

Одна из возможностей состоит в том, чтобы подсчитать количество элементов, используя металируемый ключ "newindex". При назначении чего-то не nil, увеличивайте счетчик (счетчик также может жить в метатете), а при назначении nil уменьшите счетчик.

Тестирование пустой таблицы состояло в том, чтобы проверить счетчик с помощью 0.

Здесь указатель на металитическую документацию

Мне действительно нравится ваше решение, и я честно не могу предположить, что мое решение быстрее в целом.

Ответ 3

Это, вероятно, то, что вы хотели:

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

Ответ 4

попробуй змея, работай на меня

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

Ответ 5

Я знаю, что это старое, и я могу как-то вас не понимать, но вы просто хотите, чтобы таблица была пустой, то есть, если вы просто не проверяете, есть ли это, и вы на самом деле не хотите или не нуждаетесь в ней быть пустым, вы можете очистить его, просто воссоздав его, если я не ошибаюсь. это можно сделать с помощью синтаксиса ниже.

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

Ответ 6

лучше избегать оценки __eq при перегрузке.

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

или же

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

Ответ 7

Попробуйте использовать #. Он возвращает все экземпляры, которые находятся в таблице. Если в таблице нет экземпляров, то возвращается 0

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