Germany | Finland | Saint Petersburg | Drive

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

Опубликовано в 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

Комментарии   
# yasha-fimkin 26.11.2014 06:57
можно проще:
local function dynamic_array()
local metatable = {}
metatable.__ind ex = function(tbl, key)
tbl[key] = setmetatable({} , metatable)
return tbl[key]
end
return setmetatable({} , metatable)
end
Ответить | Ответить с цитатой | Цитировать
# yasha-fimkin 26.11.2014 07:52
или
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
Ответить | Ответить с цитатой | Цитировать
# Ermak 01.01.2016 17:23
Здравствуйте. А каким образом можно было бы организовать поиск нужного значения в возвращаемой функцией метатаблице?
Ответить | Ответить с цитатой | Цитировать
# Ermak 01.01.2016 17:48
Цитирую Ermak:
Здравствуйте. А каким образом можно было бы организовать поиск нужного значения в возвращаемой функцией метатаблице?

Решение найдено! :)
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий


Архив QLua