Lua: «пары» не повторяются [1] - PullRequest
4 голосов
/ 06 октября 2011

Мне быстро пришлось что-то отлаживать, и я написал следующую функцию:

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 Ответ

10 голосов
/ 06 октября 2011

Проблема во внутренней таблице.Вы не дали ему ключ, что означает, что Lua даст ему индекс массива.А именно, 1.Который заменит ключ [1], который вы использовали для "hello??".Таким образом, вам нужно дать этому табличному значению правильный ключ, или вам нужно прекратить использовать целочисленные ключи для других.

Или, иначе говоря, следующие две таблицы идентичны:

{"first", "second", "third"}

{[3] = "third", [2] = "second", "first"} --Note the lack of a key for "first".
...