Есть ли способ преобразовать строку иерархии в табличную форму?
Предположим, что ввод A.B.C.D
вывод должен быть таблицей, которая пересекает ввод: A = {}
A.B = {}
A.B.C = {}
A.B.C.D = {}
Спасибо.
Есть ли способ преобразовать строку иерархии в табличную форму?
Предположим, что ввод A.B.C.D
вывод должен быть таблицей, которая пересекает ввод: A = {}
A.B = {}
A.B.C = {}
A.B.C.D = {}
Спасибо.
Очевидным решением было бы разобрать строку и построить из нее таблицу иерархии. Но более разумное решение — позволить lua сделать это за вас. С небольшим количеством метамагии и манипуляций с функциональной средой это можно сделать:
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" )
это выводит:
{
A = {
B = {
C = {
D = {
}
}
}
}
}
Ответ @greatwolf правильный, но я предпочитаю более простой подход к «анализу» строки и построению таблицы. Меньше магии, и вы не выполняете функцию, загруженную из (возможно) определенной пользователем строки, что было бы проблемой безопасности.
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"))
A
— это не таблица, возвращаемая createtable, а поле в этой таблице.
- person lhf; 11.07.2013
"\.([^.]+)"
.
- person catwell; 11.07.2013
local tbl="A.B.C.D"
и(function(s,k)loadstring(s..('}'):rep(k))()end)((tbl..'.'):gsub('%.','={'))
- person Egor Skriptunoff   schedule 11.07.2013