Официальная документация описывает это#так: оператор длины записывается как унарный оператор #. Длина строки — это количество её байтов (то есть длина строки, вычисляемая как один байт на символ).
Длина таблицы t определяется как целочисленный индекс n. Она удовлетворяет тому, что t[n] не равно nil, а t[n+1] равно nil; кроме того, если t
local tblTest2 =
{
1,
a = 2,
3,
}
print(table.getn(tblTest2))
Каков вывод этого кода? Вывод здесь должен быть2. Во-первых, нужно понять, что этот ctblTest2c — не простая ctable; он смешивает два стиля: список и запись. В таблице,a = 2он имеет стиль записи. Во-вторых, нужно понять, что запись в стиле записи не учитывается при вычислении длины внешней таблицы. Можно представить её как функцию; как и в других объектно-ориентированных языках, функции не записываются как внутренние переменные.
Поскольку это похоже на функцию, вы можете вывести значение a, да.print(tblTest2.a)Вот и всё.
Теперь посмотрим на следующий код:
local tblTest3 =
{
1,
{a = 2},
3,
}
print(table.getn(tblTest3))
Каков вывод этого кода? Вывод здесь должен быть3. Обратите внимание, что таблица, вложенная в таблицу, также является элементом. Следовательно, вывод —3。
table.getn(t)эквивалентно#t。
Следующий случай довольно запутанный; можете сразу прочитать итог в последнем предложении:
Теперь рассмотрим довольно запутанный случай:
local tblTest4 =
{
1,
nil,
}
print(table.getn(tblTest4))
Каков вывод этого кода? Это 1. Все мы знаем, что когда таблица получает свою длину, она проходит всю таблицу и возвращает результат на последнем значении, не равном nil.
Но как насчёт следующего кода?
local tblTest5 =
{
1,
nil,
2,
}
print(table.getn(tblTest5))
Он выводит 3. Забавно, да? При вычислении длины он считает nil элементом. Но по-настоящему сбивает с толку следующий код:
local tblTest5 =
{
1,
nil,
2,
nil
}
Он выводит 1. Вот ещё один фрагмент, который окончательно вас запутает:
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil
}
Он выводит 3. Запутались? Посмотрите ещё раз; этот раздел заставит вас с этого момента больше никогда не осмеливаться записывать значения nil в таблицу:
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil,
4,
nil
}
Взгляните, вывод этого раздела равен 1. Дорогой читатель, вы всё ещё осмеливаетесь использовать значения nil в таблицах Lua в будущем??? Если вы продолжите добавлять nil после этого, вы можете кое-что обнаружить. Вы можете подумать, что нашли закономерность. Но вы ни в коем случае не должны думать, что это закономерность. Потому что это неправильно.
- 1. Не используйте nil в таблицах.
- 2. Если вам действительно нужно использовать nil, вы должны использовать функцию table.setn() для установки длины таблицы. Примечание: новые версии Lua больше не поддерживают setn.
Мы должны подвести итог:Функция setn устарела. Не используйте значения nil в таблицах Lua. Если элемент нужно удалить, просто удалите его; не заменяйте его на nil.
Источник: http://www.cnblogs.com/youxin/p/3799339.html