Наиболее эффективный способ определить, является ли таблица Lua пустой (не содержит записей)?
Вопрос
Какой наиболее эффективный способ определить, является ли таблица пустой (то есть в данный момент не содержит ни значений в стиле массива, ни значений в стиле dict)?
В настоящее время я использую next()
:
if not next(myTable) then
-- Table is empty
end
Есть ли более эффективный способ?
Примечание:Тот самый #
operator здесь недостаточен, поскольку он оперирует только со значениями в стиле массива в таблице - таким образом #{test=2}
неотличим от #{}
потому что оба возвращают 0.Также обратите внимание, что проверка того, является ли табличная переменная nil
недостаточно, поскольку я ищу не нулевые значения, а скорее таблицы с 0 записями (т.Е. {}
).
Решение
Ваш код эффективен, но ошибочен.(Рассмотрим {[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.
лучше избегать вычисления __eq при перегрузке.
if rawequal(next(myTable), nil) then
-- myTable is empty
end
или
if type(next(myTable)) == "nil" then
-- myTable is empty
end
попробуй "змей", поработай на меня.
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
Как насчет этого ?
if endmyTable[1] == nil then
-- myTable is empty
end
Попробуйте использовать #
.Он возвращает все экземпляры, которые есть в таблице.Если в таблице нет экземпляров, то она возвращает 0
if #myTable==0 then
print('There is no instance in this table')
end