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

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

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

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

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

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

5 ответов


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

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

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

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

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

тестирование для пустой таблицы было бы проверить счетчик с 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

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

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

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