这可能是一个简单的问题,但我无法找到答案: 如何在不覆盖(所有)旧值或必须重写它们的情况下向数组添加值? 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."
谢谢!
答案 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方法)。