Как получить размер массива в LUA?

Вот код:

users = {}  
users["aaa"] = "bbbb";
users["bbb"] = "bbbb";
users["ccc"] = "bbbb";
print("Users count ", table.getn(users));

Почему table.getn(users) всегда возвращает 0? Кстати, #users тоже возвращает 0. Итак, я что-то делаю не так и есть другой способ получить количество элементов в массиве?


lua
person Tutankhamen    schedule 19.02.2013    source источник
comment
нет, он всегда возвращает 0, что бы я ни написал. Похоже, что эти методы не работают с типом индекса ключа хэш/строка массива...   -  person Tutankhamen    schedule 20.02.2013
comment
Точно. Вот что говорят вам ответы на этой странице. Это ваш точный вопрос: таблица, которая не пуста, но не имеет элементов массива.   -  person Nicol Bolas    schedule 20.02.2013


Ответы (1)


table.maxn и # ищут числовые индексы; они не увидят ваши строковые индексы.

Что касается получения количества элементов в массиве с произвольными индексами, я бы, вероятно, прошел по массиву, используя что-то вроде:

Count = 0
for Index, Value in pairs( Victim ) do
  Count = Count + 1
end

но я идиот.

person Anachronda    schedule 19.02.2013
comment
Спасибо, я это знаю, но мне нужен метод O(1), а не O(n). Я думаю, что-то подобное должно быть. Я ошибся? - person Tutankhamen; 20.02.2013
comment
@Tutankhamen: Думать, что такая вещь будет существовать, не получится. Кроме того, почему это важно? Вы не можете получить доступ к этим полям по числовому индексу, так зачем вам знать, сколько их? - person Nicol Bolas; 20.02.2013
comment
например, у меня может быть до 30 пользователей за сеанс, поэтому я хочу знать, сколько их уже есть и т. д. - person Tutankhamen; 20.02.2013
comment
Кстати, если нет другого пути, я приму этот ответ... Но в любом случае я считаю ненормальным, что массив не предоставляет такой интерфейс. - person Tutankhamen; 20.02.2013
comment
Что ж, если вы внимательно прочитаете руководство, там указано, что table.maxn и # ходят по таблице, так что они все равно не будут O(1). - person Anachronda; 20.02.2013
comment
Гах! Не знал, что Enter опубликует комментарий. Вы могли бы сделать метатаблицу с пользовательскими функциями __index и __newindex для подсчета записей по мере их добавления или удаления, но я не думал об этом. - person Anachronda; 20.02.2013
comment
Спасибо, попробую реализовать через метатаблицу. - person Tutankhamen; 20.02.2013