Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Когда точно в Lua массив (таблица только с array-part) приобретает hash-part (становится hash)?

#lua

                    
Необходимо передавать таблицы (tables) в Lua коде по сети (компьютерная мультиплеерная
игра). В связи с чем очень актуален вопрос о размерах передаваемых данных (о сохранении
их как можно меньшими).
Для сохранения структуры таблицы и "удержания" её в array-like стиле рекомендуют
использовать table.insert, table.remove... 
Имеется код (сори за форматирование, не работает в браузере):
local var = {}

for i = 1, 10000, 1 do
    table.insert ( var, i )
end

var[10000] = { var = 1, some = "string", another = {} }
var[555] = false
var[1] = 1
var[2] = {}
var[1] = {}

Вопросы:

Останется ли таблица var массивом ( таблицей только c array part ), или преобразуется
в hash ( таблицей с двумя частями array и hash ). ( Сам думаю ответ "останется только
с array-part",  так как структура таблицы не затронута - затронуты лишь значения элементов,
но очень сомневаюсь в этом ответе, а нужно знать наверняка ).
Почему? :) Как это проверить?

Предельно уточняя: если таблица изначально имеет только array-part, то приведет ли
изменение значения элемента таблицы напрямую через синтаксис var[1] = {} var[2] = false
var[3] = 1 и т.п. к изменению структуры таблицы и появлению у ней hash-part? ( При
условии что заранее дано:)
local var = {}
for i = 1, 10000, 1 do
    table.insert ( var, i )
end


Подозреваю, что ответ для кода выше "нет", но:
var[10001] = 1

Уже затронет структуру таблицы и создаст "накладные расходы" по памяти.
В связи с чем думаю ответ таков ( для кода выше) : до n <= 10000 код var[n] = {}
не затрагивает структуру таблицы,  а значит не ведет к созданию hash-part ( таблица
остается array-like). Однако код var[n + 1] = {} приведет к накладным расходам памяти
(подробнее тут http://www.lua.org/gems/sample.pdf )
Ответ правильный или нет?
Спасибо!    


Ответы

Ответ 1



Суть в том что в Lua есть только ассоциативные таблицы "ключ-значение". Она может только притворятся списком. Посему arr['1'] = 1; arr['1000000'] = 1 не значит что таблица разбухнет аж на 999999 записей.

Комментариев нет:

Отправить комментарий