Динамические многомерные массивы
Мощь языка 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
