Какой наиболее эффективный способ определить, является ли таблица пустой (то есть в настоящее время не содержит значений в стиле массива или значений в стиле dict)?
В настоящее время я использую next()
:
if not next(myTable) then
-- Table is empty
end
Есть более эффективный способ?
Примечание. #
Оператора здесь недостаточно, так как он работает только со значениями в стиле массива в таблице - поэтому #{test=2}
он неотличим от того, #{}
потому что оба возвращают 0. Также обратите внимание, что проверки, является ли переменная таблицы nil
недостаточной, поскольку я не ищу нулевые значения, а скорее таблицы с 0 записями (т.е. {}
).
false
это не было ожидаемым ключом, поэтому онif not
работал нормально, но я, вероятно, сделаю привычку сравнивать егоnil
в будущем, просто как хорошую привычку. И да, для скорости я привязал общие служебные функции к локальным варам. Тем не менее, спасибо за вклад.local next
?local next
в текущем блоке есть a , он будет использовать его, затем перейдет к следующему блоку и повторите. Выйдя из локальных, он только тогда будет использовать глобальное пространство имен. Это его упрощенная версия, но, в конце концов, это определенно означает разницу в скорости работы программы.Одна из возможностей - подсчитать количество элементов с помощью метатабельного ключа newindex. При назначении чего-то не
nil
увеличивайте счетчик (счетчик также может жить в метатаблице), а при назначенииnil
уменьшайте счетчик.Тестирование на пустую таблицу будет заключаться в проверке счетчика с 0.
Вот указатель на метатабильную документацию
Однако мне нравится ваше решение, и я, честно говоря, не могу предположить, что мое решение в целом быстрее.
источник
nil
он назначен, поскольку __newindex не запускается, если ключ уже существует в таблице.__index
и__newindex
, сохраняя фактические данные в теневой таблице и оставляя реальную таблицу пустой, чтобы__index
она вообще вызывалась. Размышляя вслух, я подозреваю, что повышенная стоимость каждого поиска не окупается.Вероятно, это то, что вы хотели:
Вывод:
источник
next()
более эффективен (и краток), чем циклpairs()
.pairs()
- это, по сути, просто использование этойnext()
техники, но с большими накладными расходами.table
не рекомендуется писать в стандартную библиотеку.лучше избегать оценки __eq при перегрузке.
или
источник
попробуй змея, работай на меня
источник
Как насчет этого ?
источник
Я знаю, что это старое, и я могу почему-то вас неправильно понять, но если вы просто хотите, чтобы таблица была пустой, то есть, если вы просто не проверяете, есть ли она, и вы на самом деле не хотите или не хотите, чтобы она была пустой, вы можете очистить его, просто воссоздав его, если я не ошибаюсь. это можно сделать с помощью синтаксиса ниже.
источник
Попробуйте использовать
#
. Он возвращает все экземпляры, находящиеся в таблице. Если в таблице нет экземпляров, возвращается0
источник
#
этого здесь недостаточно, и объясняет, почему; не могли бы вы объяснить, почему это обходится без этих причин?