Официальная документация описывает это#так: оператор длины записывается как унарный оператор #. Длина строки — это количество её байтов (то есть длина строки, вычисляемая как один байт на символ).

Длина таблицы 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