2016-06-01 1 views
1

J'ai une table qui contient des informations recueillies auprès de l'utilisateur et renseigne dans un format comme celui-ci:Copier éléments de table à nouvelle table

TempTable = {} 
TempTable["date"] = {day, month, year} 
TempTable["name"] = "Name Here" 
TempTable["address"] = "Address Here" 
etc 

J'ai alors une table principale qui contiendra toutes les informations recueillies

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

Encore assez nouveau pour Lua, j'ai un peu de mal à copier le TempTable sur le MainTable. Désolé, s'il s'agit d'un doublon, j'ai vérifié plusieurs threads similaires similaires avant de faire cela. Edit: J'ai essayé MainTable [i] = TempTable et table.insert (MainTable, TempTable). Le problème est après avoir fait ceci si n'importe quelle valeur dans TempTable change, elle changera également dans le MainTable.

+0

'maintable [i] = TempTable' ne fonctionne pas? – Nasso

Répondre

2
table.insert(MainTable, TempTable) 

aidera.

S'il vous plaît se référer à: http://www.lua.org/manual/5.3/manual.html#pdf-table.insert

Bien sûr, vous pouvez également affecter simplement aux éléments de maintable comme

MainTable[1] = TempTable 

ou MainTable[i] = TempTable dans une boucle ...

Tout ce que vous voulez.

Assurez-vous de créer une nouvelle table pour chaque instance dans MainTable. Les tableaux sont passés par référence. Si vous réutilisez ou modifiez TempTable, vous modifierez également le contenu de MainTable.

créer simplement votre TempTables dans une petite fonction (exemple simplifié)

function CreateNewEntry(name) 
local newEntry = {} 
newEntry.name = name or "no name" 
    return newEntry 
end 

utiliser ensuite comme ça:

MainTable = {} 
table.insert(MainTable, CreateNewEntry("NuMs")) 
table.insert(MainTable, CreateNewEntry("Piglet")) 
+1

Notez que cela passe une _reference_ de la table, donc toute valeur changée dans 'TempTable' sera modifiée dans' MainTable [i] ' – DavisDude

+0

Le problème est avec ces deux méthodes une fois que je fusionne le TempTable dans la MainTable les valeurs dans le MainTable prendra toutes les nouvelles valeurs prises par TempTable. – NuMs

+0

@DavisDude Heh, vous avez posté ce droit que j'ai posté mon commentaire, c'est exactement le problème. – NuMs

1

Comme porcelet a souligné, vous pouvez utiliser des tables temporairement, comme il a montré dans son exemple. La référence à la table à l'intérieur de la fonction sera perdue après la fonction, donc la seule façon d'accéder à newEntry est via la table principale. Cependant, si vous avez vraiment besoin de copier (vraiment copier) la table, vous devez utiliser une fonction pour cela. Mais gardez à l'esprit que vous n'avez souvent pas à copier.

Dans this answer, une très courte méthode de copie profonde pour les tables est affichée. Cela peut être utilisé pour rendre deux tables indépendantes les unes des autres. Cela gère également d'autres choses comme les métabalises. De plus, la réponse donne quelques liens vers d'autres lectures.

Je vous suggère de faire usage de la bibliothèque penlight pour lua, une bibliothèque 'officielle' non officielle qui est très utile. Il a un riche documentation, y compris guides pour montrer ce que vous pouvez utiliser penlight pour.Dans votre cas, il fournit une fonction deepcopy, donc tout se résume à ceci:

local tablex = require "pl.tablex" 

local tempTable = {} 
-- more code 
local mainTable = {} 
-- more code 

table.insert(mainTable, tablex.deepcopy(tempTable)) 

Enfin, un petit conseil sur la syntaxe de Lua: Une partie de lua origines dans un langage de description des données, il est donc possible pour écrire des choses très facile et agréable:

TempTable = { 
    date = { day, month, year }, 
    name = "Name Here", 
    address = "Address Here", -- you can put a comma AFTER the last element 
} 

maintenant, en utilisant l'approche de la fonction, vous pouvez tout remballer très bien:

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