Je veux convertir une table 2D Lua en une chaîne, puis après la convertir en une chaîne le convertir dans une table en utilisant cette chaîne nouvellement créée. Il semble que ce processus soit appelé sérialisement et est discuté dans l'URL ci-dessous, mais j'ai une période difficile à comprendre le code et j'espérais que quelqu'un ici avait une table simple.Tostring et table.fromstring fonction
http://lua-users.org/wiki/tampéralisation P>
8 Réponses :
Voici un programme simple qui suppose que votre table contient uniquement des chiffres. Il produit le code Lua pouvant être chargé avec Charger () () code>. Adaptez-le à la sortie à une chaîne au lieu de l'imprimer. Astuce: redéfinir l'impression Pour collecter la sortie dans une table, puis à l'extrémité, tournez la table de sortie dans une chaîne avec
TABLE.CONCAT CODE>.
t = {
{11,12,13},
{21,22,23},
}
print"return {"
for i=1,#t do
print"{"
for j=1,#t[i] do
print(t[i][j],",")
end
print"},"
end
print"}"
Le code LHF posté est un exemple de code beaucoup plus simple que tout de la page que vous avez liée, j'espère donc que vous puissiez mieux cela. L'adapter à la sortie d'une chaîne à la place de l'impression de la sortie ressemble à: L'idée générale avec la sérialisation consiste à prendre tous les bits de données de certaines structures de données comme une table, puis en boucle cette structure de données tout en construisant une chaîne comportant toutes ces bits de données ainsi que des caractères de formatage. P> P>
Merci pour le code. Je voulais dire redéfinir imprimer code> ou utiliser une fonction différente pour collecter la sortie dans une table afin que vous puissiez garder mon code d'origine surtout intact.
Je déteste la surcharge des fonctions parce que j'oublie toujours que je l'ai changé.
Je crois que #t code> doit faire certains itérant pour calculer la longueur d'une table. Il peut être plus efficace d'utiliser votre propre variable de compteur de longueur.
Cette réponse n'est-elle que valable uniquement pour les tableaux? En supposant que votre index commence sur 1 et suit la séquence ... Qu'en est-il des tables générales (indexées par toutes les valeurs, telles que des chaînes ... AKA, HASHTABLE)?
Je suggérerais fortement JSON à cette fin (c'est-à-dire la réponse de Dosimple Stackoverflow.com/a/6078812/686008 ). Ma réponse s'attaque plus à l'approche liée à la question, mais une excellente approche est vraiment sérialisée à JSON.
Cette langue est la folie.
Que diriez-vous d'un module JSON ? De cette façon, vous avez également de meilleures données échangeables. Je préfère généralement Dkjson, qui prend également en charge UTF-8, où Cmjjson ne le fera pas. P>
Upvote pour me faire comprendre que Json était la meilleure solution. J'ai déjà avait i> une bibliothèque JSON que j'utilisais dans le projet, même si j'avais oublié.
en supposant que:
une solution récursive est facile à mettre en œuvre: p> prépendez la chaîne résultant de cette fonction avec un Vous pouvez simplement utiliser DOFILE pour récupérer la table. p> notes: p> Cordialement! P> P> retour code>, stockez Il sur un fichier .lua: p>
SerializedValue code> sera plus
complexe. li>
ul>
J'utilise le code suivant afin de sérialiser les tableaux: Le code créé peut ensuite être exécuté à l'aide de Chargement (): http://www.lua.org/manual/5.1/manual.html#pdf-loadstring Si vous avez passé Un argument de paramètre "nommer" (ou l'annexez ensuite): p>
Vous savez, Tostring fonctionne aussi sur les booléens. tostring (vrai) == "vrai"
Ce code ne traite pas de choses comme a = {}; a [1] = 2; code> cependant. (
{1 = 2} CODE> N'EST PAS DOSTRING-COMPABLE) Aussi pour NIL, etc. Pour une jolie impression, il existe déjà d'autres bibliothèques.
J'ai un code plus court pour convertir la table en chaîne, mais pas inverse si vous souhaitez modifier le nom JUST RECHERCHEZ TOUT Il détecte la table imbriquée mais la séquence d'échappement que je ne sais pas si elle fonctionne p> Si vous utilisez ceci pour créer un fichier exécutable Lua qui émise la table, une erreur de compilation GE si vous mettez une nouvelle ligne et "séquence
Cette méthode est plus efficace de mémoire p> Remarque: p>
Sous the Kong fonctionne, ce hors du kong doit être installé Package Lua-Cjson https://github.com/openrotesty/lua-cjson/ p> p>
Ma solution:
local nl = string.char(10) -- newline function serialize_list (tabl, indent) indent = indent and (indent.." ") or "" local str = '' str = str .. indent.."{" for key, value in pairs (tabl) do local pr = (type(key)=="string") and ('["'..key..'"]=') or "" if type (value) == "table" then str = str..nl..pr..serialize_list (value, indent)..',' elseif type (value) == "string" then str = str..nl..indent..pr..'"'..tostring(value)..'",' else str = str..nl..indent..pr..tostring(value)..',' end end str = str:sub(1, #str-1) -- remove last symbol str = str..nl..indent.."}" return str end local str = serialize_list(tables) print('return '..nl..str)