将表元素复制到新表

时间:2016-06-01 10:18:02

标签: lua lua-table

我有一个表,其中包含来自用户的收集信息,并以如下格式填充:

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中更改。

2 个答案:

答案 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")