6
votes

Lua Table.Tostring (nom de table) et table.fromstring (StringTable) fonctionne?

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


0 commentaires

8 Réponses :


2
votes

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


0 commentaires

9
votes

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 à: xxx

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.


6 commentaires

Merci pour le code. Je voulais dire redéfinir imprimer 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 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.



7
votes

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.


1 commentaires

Upvote pour me faire comprendre que Json était la meilleure solution. J'ai déjà avait une bibliothèque JSON que j'utilisais dans le projet, même si j'avais oublié.



2
votes

en supposant que:

  • Vous n'avez pas de boucles (table d'une table de référencement B et B référençant A)
  • Vos tables sont des matrices pures (toutes les clés sont des entiers positifs consécutifs, à partir de 1)
  • Vos valeurs sont des entiers uniquement (pas de cordes, etc.)

    une solution récursive est facile à mettre en œuvre: xxx

    prépendez la chaîne résultant de cette fonction avec un retour , stockez Il sur un fichier .lua: xxx

    Vous pouvez simplement utiliser DOFILE pour récupérer la table. xxx

    notes:

    • Si vous avez des boucles, vous aurez Pour les gérer explicitement - généralement avec une table supplémentaire pour "garder une piste" de répétitions
    • Si vous n'avez pas de matrices pures, alors vous devrez analyser différemment, En plus de gérer la façon dont les clés sont rendues (sont-elles des cordes? Sont-ils d'autres tables? etc).
    • Si vous avez plus que des entiers et sous-titres, puis calculer SerializedValue sera plus complexe.

      Cordialement!


0 commentaires

17
votes

J'utilise le code suivant afin de sérialiser les tableaux: xxx

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): xxx


2 commentaires

Vous savez, Tostring fonctionne aussi sur les booléens. tostring (vrai) == "vrai"


Ce code ne traite pas de choses comme a = {}; a [1] = 2; cependant. ( {1 = 2} N'EST PAS DOSTRING-COMPABLE) Aussi pour NIL, etc. Pour une jolie impression, il existe déjà d'autres bibliothèques.



1
votes

J'ai un code plus court pour convertir la table en chaîne, mais pas inverse xxx

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

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

Remarque:

  1. Fonction non prise en charge
  2. Données utilisateur Je ne sais pas

0 commentaires

3
votes

Sous the Kong fonctionne, ce xxx

hors du kong doit être installé Package Lua-Cjson https://github.com/openrotesty/lua-cjson/


0 commentaires

1
votes

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)


0 commentaires