Цитата из Реализация Lua 5.0
Часть массива пытается сохранить значения, соответствующие целочисленным ключам от 1 до некоторого предела n. Значения, соответствующие нецелочисленным ключам или целочисленным ключам за пределами диапазона массива, хранятся в хэш-части.
Индекс части массива начинается с 1, поэтому t[0] = 0
перейдет в хеш-часть.
Вычисленный размер части массива равен наибольшему n, такому что по крайней мере половина слотов между 1 и n используется (чтобы не тратить место на разреженные массивы) и есть по крайней мере один используемый слот между n/2+1 и n( чтобы избежать размера n, когда подойдет n/2).
Согласно этому правилу в таблице примера:
local t = {100, 200, 300, x = 9.3}
Часть массива, которая содержит 3 элемента, может иметь размер 3, 4 или 5. (EDIT: размер должен быть 4, см. комментарий @dualed.)
Предположим, что массив имеет размер 4, при записи t[5] = 500
часть массива больше не может содержать элемент t[5]
, что, если размер части массива изменится до 8? При размере 8 часть массива содержит 4 элемента, что равно (значит, не меньше) половине размера массива. И индекс между n/2+1 и n, который в данном случае равен от 5 до 8, имеет один элемент: t[5]
. Таким образом, размер массива 8 может выполнить требование. В этом случае t[5]
перейдет в часть массива.
person
Yu Hao
schedule
10.07.2013