将项添加到多维数组而不覆盖旧数组?

时间:2010-12-05 12:37:53

标签: arrays lua array-push

这可能是一个简单的问题,但我无法找到答案: 如何在不覆盖(所有)旧值或必须重写它们的情况下向数组添加值? LUA中有array_push这样的东西吗?如果是这样,它是否也适用于多维数组?

示例:

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 个答案:

答案 0 :(得分:2)

首先,你所做的不是一个数组,而是一个字典。尝试:

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

否则table.insert可能是你想要的array_push

答案 1 :(得分:2)

以下索引元方法实现应该可以解决问题。

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

请注意,您正在使用字符串索引值混合数组索引值,我认为您不打算这样做。例如,您的第一行在“1”键下存储“Forest”,而第二行创建一个新的表键“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 :(得分:1)

这与标准的Lua几乎完全相同:

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

table.key表示法相当于表[“key”]表示法。 现在每个项目都在与数字键对应的值中有描述,子项目在与字符串键对应的值中有。

如果你真的想拥有与你的例子完全相同的语法,你将不得不使用元表(__index和__newindex方法)。