Динамические многомерные массивы

Опубликовано в QLua

Мощь языка Lua в совокупности с минимализмом особенно явно видны на некоторых примерах. Вот один из них - реализация динамического многомерного массива.

function dynamic_array(dimension)
local metatable = {}
for i=1, dimension do
metatable[i] = {__index = function(tbl, key)
if i < dimension then
tbl[key] = setmetatable({}, metatable[i+1])
return tbl[key]
end
end
} end
return setmetatable({}, metatable[1]);
end

Попробуем как это работает: 

local array = dynamic_array(3) Создаём трёхмерный динамический массив
print(array[0][1][2]) Берем значение по индексам 0,1,2. Его нет, результат nil
array[0][1][2] = 123 Записываем значение по индексам 0,1,2
print(array[0][1][2]) Результат 123
array[0]["first"]["second"] = "four" Используем нечисловые индексы
print(array[0]["first"]["second"]) Результат "four"
print(array[0]["first"]["third"]) nil, нет значения

 

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

См. также Многомерные массивы в QPILE

Архив QLua