Динамические многомерные массивы
Мощь языка 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
local function dynamic_array()
local metatable = {}
metatable.__ind ex = function(tbl, key)
tbl[key] = setmetatable({} , metatable)
return tbl[key]
end
return setmetatable({} , metatable)
end
local function dynamic_array(t b)
tb = tb or {}
tb.__index = function(tbl, key)
tbl[key] = setmetatable({} , tb)
return tbl[key]
end
return setmetatable(tb , tb)
end
Решение найдено! :)
RSS лента комментариев этой записи