Lua - размер таблицы возвращается - PullRequest
0 голосов
/ 24 января 2019

ребята. Кто-то может помочь мне с этим?

Введите

a = {}

a.c = {1,2,3}

print(#a)

print(a.c)

выход

0

table: 0x11ed7a0

Почему #a равно 0? Почему не 1?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Это ноль, потому что ваша таблица a не является последовательностью.

Последовательность - это таблица, в которой используются ключи из 1..n, где n - размер последовательности.

Другими словами, # используется для длины последовательности, а не длины таблицы.

Из Lua 5.3 Справочное руководство

Таблица с ровно одной границей называется последовательностью. Например, таблица {10, 20, 30, 40, 50} является последовательностью, так как имеет только одну границу (5). Стол {10, 20, 30, ноль, 50} имеет две границы (3 и 5), и поэтому это не последовательность. Таблица {ноль, 20, 30, ноль, ноль, 60, ноль} имеет три границы (0, 3, и 6), так что это тоже не последовательность. Таблица {} является последовательностью с границей 0. Обратите внимание, что неестественные ключи не влияют на то, является ли таблица последовательностью.

Когда t является последовательностью, #t возвращает свою единственную границу, которая соответствует Интуитивное представление о длине последовательности. Когда t не последовательность, #t может вернуть любую из своих границ. (Точный зависит от деталей внутреннее представление таблицы, которая в свою очередь может зависеть от того, как таблица был заполнен и адреса памяти его нечисловых ключей.)

0 голосов
/ 24 января 2019

Lua таблицы - это другой вид конструкции, чем в других языках.Как указано в руководстве Lua :

Таблицы являются основным (фактически единственным) механизмом структурирования данных в Lua и мощным.Мы используем таблицы для представления простых массивов, таблиц символов, наборов, записей, очередей и других структур данных простым, единообразным и эффективным способом.

Кроме того, таблица достаточно динамична, чтобыВы можете использовать его несколькими способами одновременно.Например, таблица может использоваться одновременно как массив и как карта.Это имеет некоторые печальные последствия внутри страны.Внутри каждая таблица Lua состоит из двух частей: массива и хэш-карты.

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

В качестве примечания, которое может заинтересовать, иногда бывает трудно сказать,если значение хранится в массиве или хеш-частях таблицы.Рассмотрим эти примеры в Lua 5.3:

1: t = {true, nil, true}  -- #t = 3
2: t = {true, [2] = true} -- #t = 2
3: t = {true, [3] = true} -- #t = 1
4: t = {true, true, true} t[2] = nil -- #t = 3
...