Пытаясь понять пример в книге «Программирование на Lua» - PullRequest
1 голос
/ 25 мая 2019

Пытаясь понять упражнение 5.1 в Программирование на Lua, четвертое издание

Код включен, но я не понимаю, что происходит

sunday = "monday" ; monday = "sunday"
print("After first line ", sunday, monday)
t = {sunday = "monday", [sunday] = monday}
print("Printing #t", #t)
for k = 1 , #t do
  print(k, t[k])
end
print("After printing ipairs")
print(t.sunday, t[sunday], t[t.sunday])

Я получаю следующие результаты: -

После первой строки понедельник воскресенье
Печать #t 0
После печати ipairs
понедельник воскресенье воскресенье

Меня смущает третья строка. Почему количество элементов в т ноль ??

1 Ответ

1 голос
/ 25 мая 2019

Длина таблицы t определяется как любой целочисленный индекс n, такой что t [n] не равен nil и t [n + 1] равен nil; более того, если t 1 равно нулю, n может быть нулем. Для обычного массива с ненулевыми значениями от 1 до заданного n его длина в точности равна n, индексу его последнего значения. Если в массиве есть «дыры» (то есть, значения nil между другими значениями, отличными от nil), то #t может быть любым из индексов, которые непосредственно предшествуют значению nil (то есть он может рассматривать любое такое значение nil как конец массива).

Взято из Руководства Lua 5.1

Чтобы правильно получить длину таблицы с помощью оператора #, таблица должна быть проиндексирована целыми числами и быть последовательной. Например: t = {[1] = "monday", [2] = monday}

В вашем случае ключи вашей таблицы являются строками. Существуют методы для обхода непоследовательных таблиц, один из них - с помощью функции pairs.

t = {sunday = "monday", [sunday] = monday}
for k, v in pairs(t) do
  print(k, v)
end

Точно так же, чтобы получить длину непоследовательной таблицы, вы можете перебрать таблицу и сосчитать количество элементов. Как получить количество записей в таблице Lua?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...