Почему вывод t [1] равен 1 для локального t = {1, [1] = "a", [2] = "b"} - PullRequest
3 голосов
/ 17 мая 2019

Тестовый код:

local t = {1, [1] = "a", [2] = "b"}
print("t[1]: ", t[1])
for _, v in pairs(t) do
    print(v)
end

Выход:

t[1]: 1
1
b

1 Ответ

8 голосов
/ 17 мая 2019

Порядок, в котором поля устанавливаются в конструкторах таблиц, не определен, если у вас есть дубликаты ключей.

В настоящее время компилятор группирует записи списка (50 записей списка на пакет).

Байт-кодваш конструктор можно увидеть, запустив luac -l в вашем скрипте:

1   [1] NEWTABLE    0 1 2
2   [1] LOADK       1 -1    ; 1
3   [1] SETTABLE    0 -1 -2 ; 1 "a"
4   [1] SETTABLE    0 -3 -4 ; 2 "b"
5   [1] SETLIST     0 1 1   ; 1

Обратите внимание на SETLIST в конце.Для {10,20,30, [1] = "a", [2] = "b"} байт-код:

1   [1] NEWTABLE    0 3 2
2   [1] LOADK       1 -1    ; 10
3   [1] LOADK       2 -2    ; 20
4   [1] LOADK       3 -3    ; 30
5   [1] SETTABLE    0 -4 -5 ; 1 "a"
6   [1] SETTABLE    0 -6 -7 ; 2 "b"
7   [1] SETLIST     0 3 1   ; 1

Если конструктор начинался со списка, скажем, длиной 60, то конечное значение t [1] будет равно «a».

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