Самый эффективный способ определить, является ли таблица 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