Lua по-разному оценивает значения вложенных таблиц при вызове его длины? - PullRequest
0 голосов
/ 25 августа 2018

В качестве предисловия я использую repl.it, а не Lua на рабочем столе. Это может быть проблемой, но я не могу быть уверен, поскольку у меня нет легкого доступа к другому переводчику Lua.

У меня проблема с более крупной программой, но та же проблема видна в следующем фрагменте:

stuff = {}
list = {"hello"}
table.insert(stuff,list)
table.remove(list)
print(unpack(stuff[1]))

При запуске я ожидаю, что он распечатает неупакованную таблицу, найденную на stuff[1], которая должна быть "hello", потому что это значение list, когда я его установил. Использование предпочтительного метода вставки и удаления, как показано ниже, дает те же результаты.

test = {}
help = {"hello"}
test[#test+1] = help
help[#help] = nil
print(unpack(test[1]))

Однако, если я не называю длину, а использую магическое число или константу, она работает просто отлично, как в двух примерах ниже.

what = {}
the = {"hello"}
what[1] = the
the = nil
print(unpack(what[1]))

how = {}
questionmark = {"hello"}
one = 1
what[one] = questionmark
questionmark = nil
print(unpack(what[one]))

Наконец, этого нет, если не используются вложенные таблицы, как в этом примере:

notnested = {}
nottable = "hello"
notnested[#notnested+1] = nottable
nottable = nil
print(notnested[1])

Что здесь происходит? Я неправильно понимаю сроки объявлений, что-то делаю неправильно или виноват repl.it/Lua?

Это repl.it из пяти приведенных выше примеров: https://repl.it/@typhirz/LightsalmonDenseCodeview

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Никол Болас ниже предоставил некоторую информацию, которая привела к моему решению в моей более крупной программе. Вместо stuff[1] = list я использовал stuff[1] = {unpack(list)}, что заставило его создать новую таблицу, отдельную от list, что позволило мне позже манипулировать list, не изменяя ничего внутри stuff. Поскольку это мелкая копия, она работает не во всех случаях (особенно если есть дополнительные вложения), поэтому вместо этого изучите глубокие копии для более надежного решения.

0 голосов
/ 25 августа 2018
table.remove(list)
help[#help] = nil

Это не то же самое:

the = nil

Первые два манипулируют таблицей , хранящейся впеременная list / help.Во втором просто отсутствует переменная the.Таблица, хранящаяся в list / help, также была сохранена в таблице stuff / test.

Изменения в переменной отличаются от изменений в таблице сохранены в переменной.

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