Lua: ‘pairs’ не выполняет итерацию по [1]

#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".