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.
Réponses
Trop de publicités?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!
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
}
}
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 ...
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
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