Звучит как вопрос "позволь мне погуглить для тебя", но почему-то я не могу найти ответа. Оператор Lua #
считает только записи с целочисленными ключами, и то же самое table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
Как получить количество всех записей, не считая их?
dictionary[value] = #dictionary + 1
: где#
обозначает количество всех объектов. Что я интересно , почему вы не хотите: во всех здравомыслящих прецедентах для # (см ответа на kaizer.se), подсчет всех объектов в точности равен тому , что уже # возвратов; похоже, что # подсчитывать все - это строго улучшение. Конечно, я новичок в Lua и могу упустить суть.#
оператор просто некорректно определен. Это так легко исправить: во-первых, сделайте#
детерминированным, а во-вторых, введите новый оператор или функцию, чтобы получить счет. Конец истории ... Почему они должны быть такими упрямыми? :)Ответы:
У вас уже есть решение вопроса - единственный способ - перебрать всю таблицу с помощью
pairs(..)
.Также обратите внимание, что определение оператора "#" немного сложнее. Позвольте мне проиллюстрировать это, взяв эту таблицу:
Согласно руководству, любые из 3, 5 и 9 являются действительными результатами для
#t
. Единственный разумный способ его использования - использовать массивы из одной непрерывной части без значений nil.источник
#
не детерминировано.According to the manual, any of 3, 5 and 9 are valid results for #t
, Согласно руководству, вызов # для непоследовательностей не определен . Это означает, что любой результат (-1, 3, 3.14, 5, 9) действителен.Вы можете настроить мета-таблицу для отслеживания количества записей, это может быть быстрее, чем итерация, если эта информация требуется часто.
источник
Есть один способ, но он может вас разочаровать: использовать дополнительную переменную (или одно из полей таблицы) для хранения счетчика и увеличивать его каждый раз, когда вы делаете вставку.
Другого пути нет, оператор # будет работать только с таблицами типа массивов с последовательными ключами.
источник
Самый простой способ узнать количество записей в таблице - это использовать символ «#». #tableName получает количество записей, если они пронумерованы:
К сожалению, если они не пронумерованы, это не сработает.
источник
Вы можете использовать библиотеку фонарика . Это имеет функцию
size
которая дает фактический размер таблицы.В нем реализовано множество функций, которые могут понадобиться нам при программировании и которые отсутствуют в Lua.
Вот пример его использования.
источник
источник
__newindex
вызывается только при определении нового ключа, поэтому нет возможности вызвать,__newindex
когда мы устанавливаемnil
существующий ключ.кажется, что когда элементы таблицы добавляются методом вставки, getn вернется правильно. В противном случае мы должны посчитать все элементы
Он напечатает 2 правильно
источник