Следующая index реализация метаметода должна сработать.
local mt = {}
mt.__index = function(t, k)
local v = {}
setmetatable(v, mt)
rawset(t, k, v)
return v
end
Array={"Forest","Beach","Home"} --places
setmetatable(Array, mt)
Array["Forest"] = {"Trees","Flowers"} --things you find there
Array["Forest"]["Trees"] = "A tree is a perennial woody plant" --description
Array["Restaurant"]["Spoon"] = "A type of cutlery."
Обратите внимание, что вы смешиваете индексированные значения массива со строковыми индексированными значениями, и я не думаю, что вы намеревались это сделать. Например, ваша первая строка хранит «Forest» под ключом «1», а вторая строка создает новый ключ таблицы «Forest» со значением таблицы, которое содержит последовательные строковые значения. Следующий код распечатывает сгенерированную структуру, чтобы продемонстрировать мое значение.
local function printtree(node, depth)
local depth = depth or 0
if "table" == type(node) then
for k, v in pairs(node) do
print(string.rep('\t', depth)..k)
printtree(v, depth + 1)
end
else
print(string.rep('\t', depth)..node)
end
end
printtree(Array)
Далее выводится два фрагмента кода, перечисленных выше.
1
Forest
2
Beach
3
Home
Restaurant
Spoon
A type of cutlery.
Forest
1
Trees
2
Flowers
Trees
A tree is a perennial woody plant
При таком понимании вы сможете решить свою проблему без такой хитрости следующим образом.
Array = {
Forest = {},
Beach = {},
Home = {}
}
Array["Forest"] = {
Trees = "",
Flowers = "",
}
Array["Forest"]["Trees"] = "A tree is a perennial woody plant"
Array["Restaurant"] = {
Spoon = "A type of cutlery."
}
printtree(Array)
Выходной результат - то, что вы, вероятно, ожидали.
Restaurant
Spoon
A type of cutlery.
Beach
Home
Forest
Flowers
Trees
A tree is a perennial woody plant
Имея все это в виду, следующее выполняет то же самое, но гораздо яснее, по моему скромному мнению.
Array.Forest = {}
Array.Beach = {}
Array.Home = {}
Array.Forest.Trees = ""
Array.Forest.Flowers = ""
Array.Forest.Trees = "A tree is a perennial woody plant"
Array.Restaurant = {}
Array.Restaurant.Spoon = "A type of cutlery."
printtree(Array)