2013-07-11 10 views
5

Gibt es eine Möglichkeit, dass ich einen hierarchischen String in Tabellenform konvertieren kann?Lua Hierarchie String zu Tabelle

Angenommen, das Eingangs A.B.C.D

ouput ist, sollte eine Tabelle sein, die über Eingabe quert: A = {} A.B = {} A.B.C = {} A.B.C.D = {}

Dank.

+0

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

Antwort

5

Die naheliegende Lösung wäre, die Zeichenfolge zu parsen und die Hierarchietabelle daraus zu konstruieren. Aber eine cleverere Lösung ist, lua es für Sie tun zu lassen. Mit etwas metamagische und Funktion Umgebung Manipulation kann dies geschehen:

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

diese Ausgänge:

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

@ Antwort greatwolf das ist richtig, aber ich ziehe den einfacheren Ansatz der „Parsen“ die Zeichenfolge und Konstruieren der Tabelle. Weniger Magie, und Sie führen keine Funktion aus, die von einer (möglicherweise) benutzerdefinierten Zeichenfolge geladen wird, was ein Sicherheitsproblem wäre.

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

Schön. Beachten Sie, dass 'A' nicht die von createtable zurückgegebene Tabelle ist, sondern ein Feld in dieser Tabelle. – lhf

+0

Ja, ich habe @ greewolfs Ausgabe kopiert. Wenn Sie A zurückgeben möchten, müssen Sie nur den ersten Teil der Zeichenfolge überspringen, z. indem Sie das Muster in '" \. ([^.] +) "' ändern. – catwell