Самый эффективный способ определить, является ли таблица Lua пустой (не содержит записей)? - PullRequest
109 голосов
/ 10 августа 2009

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

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

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

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

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

Ответы [ 8 ]

133 голосов
/ 10 августа 2009

Ваш код эффективен, но неверен. (Рассмотрим {[false]=0}.) Правильный код

if next(myTable) == nil then
   -- myTable is empty
end

Для максимальной эффективности вы хотите связать next с локальной переменной, например,

...
local next = next 
...
... if next(...) ...
1 голос
/ 10 августа 2009

Одна из возможностей - подсчитать количество элементов, используя метатабельный ключ "newindex". При назначении чего-либо, отличного от nil, увеличьте счетчик (счетчик может также находиться в метатаблице), а при назначении nil уменьшите счетчик.

Проверка на пустую таблицу будет проверять счетчик с 0.

Вот указатель на метатируемая документация

Мне действительно нравится ваше решение, и я, честно говоря, не могу предположить, что мое решение в целом быстрее.

0 голосов
/ 31 мая 2019

Как насчет этого?

if endmyTable[1] == nil then
  -- myTable is empty
end
0 голосов
/ 18 мая 2019

попробуй змея, работай на меня

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
0 голосов
/ 03 декабря 2018

лучше избегать оценки __eq при перегрузке.

if rawequal(next(myTable), nil) then
   -- myTable is empty
end

или

if type(next(myTable)) == "nil" then
   -- myTable is empty
end
0 голосов
/ 04 января 2017

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

if #myTable==0 then
print('There is no instance in this table')
end
0 голосов
/ 04 мая 2016

Я знаю, что это старо, и я могу как-то вас неправильно понять, но если вы просто хотите, чтобы таблица была пустой, то есть, если вы просто не проверяете, есть ли она, и вы на самом деле не хотите или не хотите этого быть пустым, вы можете очистить его, просто воссоздав его, если я не ошибаюсь. это можно сделать с помощью приведенного ниже синтаксиса.

yourtablename = {} -- this seems to work for me when I need to clear a table.
0 голосов
/ 12 апреля 2012

Это, вероятно, то, что вы хотели:

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
...