203 votes

Lua beginner: Table dump to console

J'expérimente avec Lua et je ne parviens pas à afficher le contenu d'une table contenant des tables imbriquées (n-deep). J'aimerais simplement le transférer sur la console ou sur la console via une instruction print ou quelque chose de rapide et sale, mais je ne peux pas comprendre comment. Je recherche l'équivalent approximatif que j'obtiendrais lors de l'impression d'un NSDictionary utilisant gdb.

157voto

kikito Points 23229

Je sais que cette question a déjà été marqué comme réponse, mais permettez-moi de brancher ma propre bibliothèque. Il est appelé à inspecter.lua, et vous pouvez le trouver ici:

https://github.com/kikito/inspect.lua

Il suffit d'un seul fichier que vous pouvez avoir besoin à partir de n'importe quel autre fichier. Elle renvoie une fonction qui transforme n'importe quelle Lua valeur dans une chaîne explicite:

local inspect = require('inspect')

print(inspect({1,2,3})) -- {1, 2, 3}
print(inspect({a=1,b=2})
-- {
--   a = 1
--   b = 2
-- }

Il tirets sous-tables correctement, et les poignées "récursive" tables (les tables qui contiennent des références à eux-mêmes) correctement, de sorte qu'il ne soit pas dans une boucle infinie. Il trie les valeurs d'une manière sensible. Il imprime aussi métatable de l'information.

Ce qui concerne les!

75voto

Michal Kottman Points 8682

N'hésitez pas à parcourir le Wiki Lua sur la sérialisation des tables . Il répertorie plusieurs manières de vider une table sur la console.

Il vous suffit de choisir celui qui vous convient le mieux. Il y a plusieurs façons de le faire, mais je finis généralement par utiliser celle de Penlight :

 > t = { a = { b = { c = "Hello world!", 1 }, 2, d = { 3 } } }
> require 'pl.pretty'.dump(t)
{
  a = {
    d = {
      3
    },
    b = {
      c = "Hello world!",
      1
    },
    2
  }
}
 

33voto

JCH2k Points 170

trouvé ceci:

 -- Print contents of `tbl`, with indentation.
-- `indent` sets the initial level of indentation.
function tprint (tbl, indent)
  if not indent then indent = 0 end
  for k, v in pairs(tbl) do
    formatting = string.rep("  ", indent) .. k .. ": "
    if type(v) == "table" then
      print(formatting)
      tprint(v, indent+1)
    elseif type(v) == 'boolean' then
      print(formatting .. tostring(v))      
    else
      print(formatting .. v)
    end
  end
end
 

à partir d'ici https://gist.github.com/ripter/4270799

fonctionne très bien pour moi ...

2voto

kartben Points 528

Le table.tostring metehod de metalua est en réalité très complet. Il traite des tables imbriquées, le niveau d'indentation est modifiable, ... Voir https://github.com/fab13n/metalua/blob/master/src/lib/metalua/table2.lua

1voto

Borodin Points 52478

Vous devez le coder vous-même, j'ai bien peur. J'ai écrit ceci, et cela peut vous être utile

 function printtable(table, indent)

  indent = indent or 0;

  local keys = {};

  for k in pairs(table) do
    keys[#keys+1] = k;
    table.sort(keys, function(a, b)
      local ta, tb = type(a), type(b);
      if (ta ~= tb) then
        return ta < tb;
      else
        return a < b;
      end
    end);
  end

  print(string.rep('  ', indent)..'{');
  indent = indent + 1;
  for k, v in pairs(table) do

    local key = k;
    if (type(key) == 'string') then
      if not (string.match(key, '^[A-Za-z_][0-9A-Za-z_]*$')) then
        key = "['"..key.."']";
      end
    elseif (type(key) == 'number') then
      key = "["..key.."]";
    end

    if (type(v) == 'table') then
      if (next(v)) then
        printf("%s%s =", string.rep('  ', indent), tostring(key));
        printtable(v, indent);
      else
        printf("%s%s = {},", string.rep('  ', indent), tostring(key));
      end 
    elseif (type(v) == 'string') then
      printf("%s%s = %s,", string.rep('  ', indent), tostring(key), "'"..v.."'");
    else
      printf("%s%s = %s,", string.rep('  ', indent), tostring(key), tostring(v));
    end
  end
  indent = indent - 1;
  print(string.rep('  ', indent)..'}');
end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X