Наиболее эффективный способ определить, является ли таблица 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, инкремент счетчика (счетчик может жить в метатаблиц) и при назначении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.
попробуйте использовать
#. Он возвращает все экземпляры, которые находятся в таблице. Если в таблице нет экземпляров, то она возвращает0if #myTable==0 then print('There is no instance in this table') end
Comments