2013-07-11 4 views
5

Esiste un modo per convertire una stringa di gerarchia in una tabella?Lua hierarchy string to table

Supponiamo l'ingresso è A.B.C.D

output dovrebbe essere una tabella che attraversa sopra ingresso: A = {} A.B = {} A.B.C = {} A.B.C.D = {}

Grazie.

+0

'local tbl =" ABCD "' e '(funzione (s, k) loadstring (s .. ('}'): rep (k))() end) ((tbl .. '. '): gsub ('%. ',' = {')) ' –

risposta

5

La soluzione ovvia sarebbe di analizzare la stringa e costruire la tabella gerarchica da quella. Ma una soluzione più intelligente è lasciare che lo faccia per te. Con un po 'di metamagico e l'ambiente funzione di manipolazione questo può essere fatto:

dump = require 'pl.pretty'.dump -- convenient table dumper from penlight 

function createtable(str) 
    local env_mt = {} 
    env_mt.__index = function(t, k) 
        rawset(t, k, setmetatable({}, env_mt)) 
        return rawget(t, k) 
        end 
    local env = setmetatable({}, env_mt) 
    local f = loadstring("return "..str) 
    setfenv(f, env) 
    f() 
    return env 
end 

dump(createtable "A.B.C.D") 

queste uscite:

{ 
    A = { 
    B = { 
     C = { 
     D = { 
     } 
     } 
    } 
    } 
} 
5

@ risposta di greatwolf è giusto, ma io preferisco l'approccio più diretto di "parsing" la corda e costruire il tavolo. Meno magia, e non si esegue una funzione caricata da una (eventualmente) stringa definita dall'utente, che sarebbe un problema di sicurezza.

local createtable = function(str) 
    local top = {} 
    local cur = top 
    for i in str:gmatch("[^.]+") do 
    cur[i] = {} 
    cur = cur[i] 
    end 
    return top 
end 

(require "pl.pretty").dump(createtable("A.B.C.D")) 
+2

Bello. Basta notare che 'A' non è la tabella restituita da creaetable, ma un campo in quella tabella. – lhf

+0

Sì, ho copiato l'output di @ greatwolf. Se vuoi restituire A devi solo saltare la prima parte della stringa, ad es. cambiando il modello in '" \. ([^.] +) "'. – catwell