Походит "позволенный меня, гуглят его для Вас" вопрос, но так или иначе я не могу найти ответ. 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"
Как я получаю количество всех записей, не считая их?
У вас уже есть решение вопроса - единственный способ - перебрать всю таблицу с парами (..)
.
function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
Также обратите внимание, что определение оператора "#" немного сложнее этого. Позвольте мне проиллюстрировать это, взяв эту таблицу:
t = {1,2,3}
t[5] = 1
t[9] = 1
Согласно руководству, любые из 3, 5 и 9 являются допустимыми результатами для #t
. Единственный разумный способ его использования - это массивы из одной непрерывной части без значений nil.
Вы можете настроить мета-таблицу для отслеживания количества записей, это может быть быстрее, чем итерация, если эта информация требуется часто.
Есть один способ, но он может вас разочаровать: использовать дополнительную переменную (или одно из полей таблицы) для хранения счетчика и увеличивать его каждый раз делаешь прошивку.
count = 0
tbl = {}
tbl["test"] = 47
count = count + 1
tbl[1] = 48
count = count + 1
print(count) -- prints "2"
Другого пути нет, оператор # будет работать только с таблицами, подобными массивам, с последовательными ключами.