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

StackOverflow https://stackoverflow.com/questions/1252539

  •  12-09-2019
  •  | 
  •  

Вопрос

Какой наиболее эффективный способ определить, является ли таблица пустой (то есть в данный момент не содержит ни значений в стиле массива, ни значений в стиле 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top