2016-04-25 1 views
3

Может ли кто-нибудь объяснить это кажущееся безумие?Как работает оператор длины Lua?

> t = {1, 2, 3} -- Table length 3. Simple 
> = #t 
3 -- Yep 

> t[3] = nil -- Remove the last element? 
> = #t 
2 -- Ok it realises it is the last one (since #t = 3) and decrements the length 

> t[6] = 6 -- Add a separate element? 
> = #t 
2 -- Ok... I guess? Although surely it knew #t = 2, and so now #t should be 6? 

> t[4] = 4 -- Add another separate element 
> = #t 
4 -- Errr... what. 

> t[5] = 5 -- Append another element 
> = #t 
6 -- Ok now it remembers element 6? Wtf? 

Хорошо позвольте мне попробовать еще раз ...

> t = {1, 2, 3} 
> = #t 
3 
> t[10] = 10 
> = #t 
3 
> t[4] = 4 
> = #t 
4 
> t[9] = 9 
> = #t 
4 
> t[8] = 8 
> = #t 
10 

Что.

+0

Ах да, это объясняет. Я не знаю, почему у них не было #t return nil или -1 для неопределенных случаев. – Timmmm

+0

Вы можете реализовать свой собственный метаметод '__len', чтобы возвращать другой результат для таблиц без последовательности, но вам все равно придется определять, является ли таблица правильной последовательностью или нет. – Adam

ответ

5

Длина таблицы определяется только в том случае, если таблица является правильной последовательностью (последовательные целые ключи).

Lua manual объясняет оператор длина:

За исключением случаев, __len Метаметод не дается, длина таблицы т определяется только если таблица представляет собой последовательность, то есть множество его положительного числового ключи равны {1..n} для некоторого неотрицательного целого числа n. В этом случае n - его длина. Обратите внимание, что таблица, как

{10, 20, nil, 40} 

не является последовательностью, поскольку она имеет ключ 4, но не имеет ключ 3. (Таким образом, не существует п такое, что множество {1..n} является равный набору положительных числовых клавиш этой таблицы.) Обратите внимание, однако, что нечисловые клавиши не мешают тому, является ли таблица последовательностью.

Смежные вопросы