#lua #iterator #lua-table
#lua #итератор #lua-таблица
Вопрос:
Мне быстро пришлось что-то отлаживать, и я написал следующую функцию:
function dumpTable(t)
for i,v in pairs(t) do
if type(v) == "table" then
dumpTable(v)
else
print(i..":", v)
end
end
end
Теперь, по какой-то причине
dumpTable({[1]="hello??", [2]="two", {[132]="something", [3.2]="else"}})
выводит
132: something
3.2: else
2: two
обратите внимание, что первая строка отсутствует? Но если я изменю его ключ..
dumpTable({["one"]="hello??", [2]="two", {[132]="something", [3.2]="else"}})
он выводит
132: something
3.2: else
one: hello??
2: two
Это настолько неинтуитивно, что я почти чувствую себя идиотом, не видя ошибки..
(кстати. Я знаю, что моя функция переполнит стек, если таблица содержит рекурсивную ссылку, собираюсь исправить это позже)
Ответ №1:
Проблема во внутренней таблице. Вы не дали ему ключ, что означает, что Lua предоставит ему индекс массива. А именно 1
. Который перезапишет [1]
ключ, который вы использовали для "hello??"
. Поэтому вам нужно присвоить этому табличному значению правильный ключ, или вам нужно прекратить использовать целочисленные ключи для других.
Или, другими словами, следующие две таблицы идентичны:
{"first", "second", "third"}
{[3] = "third", [2] = "second", "first"} --Note the lack of a key for "first".