Добавление элементов в многомерный массив без перезаписи старых? - PullRequest
1 голос
/ 05 декабря 2010

это может быть простой вопрос, но я так и не смог найти на него ответ: как добавить значение в массив без перезаписи (всех) старых значений или необходимости перезаписывать их?Есть ли такая вещь как array_push в LUA?И если да, то работает ли он и для многомерных массивов?

Пример:

Array={"Forest","Beach","Home"} --places
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."

, потому что я должен объявить все эти вещи, а также старые, так что я непереписать их.Поэтому я ищу что-то вроде:

array_push(Array, "Restaurant")
array_push(Array["Restaurant"],"Spoon")
Array["Restaurant"]["Spoon"] = "A type of cutlery."

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Следующая 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)
2 голосов
/ 05 декабря 2010

Во-первых, вы создаете вовсе не массив, а словарь. Попробуйте:

T = { Forest = { } , Beach = { } , Home = { } }
T.Forest.Spoon = "A type of cutlery"

В противном случае table.insert может быть тем, что вы хотите в array_push

1 голос
/ 05 декабря 2010

Это почти идентично стандартному Lua, вот так:

Array.Restaurant={}
Array.Restaurant.Spoon={}
Array.Restaurant.Spoon[1]="A type of cutlery."

нотация table.key эквивалентна нотации table ["key"]. Теперь каждый элемент имеет свое описание в значении, соответствующем цифровой клавише, и подэлементы как значения, соответствующие строковым ключам.

Если вы действительно хотите использовать тот же синтаксис, что и в вашем примере, вам придется использовать метатаблицы (методы __index и __newindex).

...