我有一个表,其中包含来自用户的收集信息,并以如下格式填充:
TempTable = {}
TempTable["date"] = {day, month, year}
TempTable["name"] = "Name Here"
TempTable["address"] = "Address Here"
etc
然后我有一个主表将保存所有收集的信息
MainTable = {}
MainTable[1] = { date = {day, month, year}, name = "Name Here", address = "Address Here" }
MainTable[2] = { date = {day, month, year}, name = "Name Here", address = "Address Here" }
对于Lua来说还是一个新手,所以我在将TempTable复制到MainTable时遇到了一些麻烦。
很抱歉,如果这是重复的,我在制作之前已经检查了许多类似的命名线程。
编辑:我尝试过MainTable [i] = TempTable和table.insert(MainTable,TempTable)。问题是在执行此操作后,如果TempTable中的任何值发生更改,它也会在MainTable中更改。
答案 0 :(得分:2)
table.insert(MainTable, TempTable)
会有所帮助。
请参阅: http://www.lua.org/manual/5.3/manual.html#pdf-table.insert
当然,您也可以简单地将其分配给MainTable的元素,如
MainTable[1] = TempTable
循环中的或MainTable[i] = TempTable
...
无论你想要什么。
确保为MainTable中的每个实例创建一个新表。表格通过引用传递。如果您重复使用或更改TempTable,您还将更改MainTable的内容。
只需在一个小功能(简化示例)中创建您的TempTables
function CreateNewEntry(name)
local newEntry = {}
newEntry.name = name or "no name"
return newEntry
end
然后像这样使用它:
MainTable = {}
table.insert(MainTable, CreateNewEntry("NuMs"))
table.insert(MainTable, CreateNewEntry("Piglet"))
答案 1 :(得分:1)
正如小猪指出的那样,你可以使用临时表,就像他在他的例子中所展示的那样。在函数之后对函数内部表的引用将丢失,因此访问newEntry
的唯一方法是通过主表。
但是,如果你真的需要复制(真正复制)表,你需要使用一个函数。但请记住,您通常不必复制。
在this answer中,显示了一种非常短的表格深度复制方法。这可以用于使两个表彼此独立。这也处理其他一些东西,如metatables。此外,答案提供了一些进一步阅读的链接。
我建议你使用lua的penlight库,这是一个非常有用的非官方“标准”库。它有一个丰富的documentation,包括guides,以显示您可以使用的笔记本。在您的情况下,它提供了深度复制功能,所以这一切都归结为:
local tablex = require "pl.tablex"
local tempTable = {}
-- more code
local mainTable = {}
-- more code
table.insert(mainTable, tablex.deepcopy(tempTable))
最后,对lua语法提出了一些建议:lua的一部分起源于数据描述语言,因此可以非常轻松地编写这些内容:
TempTable = {
date = { day, month, year },
name = "Name Here",
address = "Address Here", -- you can put a comma AFTER the last element
}
现在使用函数方法,你可以很好地收拾所有东西:
function create_entry(name, address, date)
local date = date or get_current_date() -- use date parameter or the current date if absent
return {
name = name,
address = address,
date = date
}
end
-- can be used like this:
table.insert(mainTable, create_entry("Foibudle", "12345 Dreamland", date("12-03-2015"))
-- can be used without the date:
table.insert(mainTable, create_entry("Foibudle", "12345 Dreamland")