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



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



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



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


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



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

937   5  

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.

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

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

Comments

    Ничего не найдено.