开发者

Adding items to a multidimensional array without overwriting the old ones?

this may be a simple question, yet I haven't been able to find an ans开发者_StackOverflowwer to it: How do I add a value to an array without overwriting (all) old values, or having to rewrite them? Is there such a thing as array_push in LUA? And if so, does it work for multidimensional arrays as well?

Example:

Array={"Forest","Beach","Home"} --places
Array["Forest"] = {"Trees","Flowers"} --things you find there
Array["Forest"]["Trees"] = "A tree is a perennial woody plant" --description

If I'd like to add a description of a new thing in a new place, I can't do it using

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

because I'd have to declare all these things, as well as the old ones so I don't overwrite them. So I'm looking for something like:

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

Thanks!


The following index metamethod implementation should do the trick.

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."

Note that you are mixing array indexed values with with string indexed values, and I don't think you intended to do so. For example, your first line stores "Forest" under the key "1", while the second line creates a new table key "Forest" with a table value that holds sequential string values. The following code prints out the generated structure to demonstrate my meaning.

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)

Next is the resulting output of the two code snippets listed above.

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

With this understanding, you could then solve your problem without such trickery as follows.

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)

The output is then what you probably expected.

Restaurant
    Spoon
        A type of cutlery.
Beach
Home
Forest
    Flowers

    Trees
        A tree is a perennial woody plant

With all of that in mind, the following accomplishes the same thing, but is much clearer in my humble opinion.

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)


First, what you're making is not an array at all, but a dictionary. Try:

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

Otherwise table.insert may be what you want in array_push


This is almost identically there in standard Lua like this:

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

the table.key notation is equivalent of the table["key"] notation. Now every item has it's description in the value corresponding to a number-key, and sub items as values corresponding to string keys.

If you really want to have exactly the same syntax as your example, you'll have to use metatables (__index and __newindex methods).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜