Строка иерархии Lua в таблицу

Есть ли способ преобразовать строку иерархии в табличную форму?

Предположим, что ввод A.B.C.D

вывод должен быть таблицей, которая пересекает ввод: A = {} A.B = {} A.B.C = {} A.B.C.D = {}

Спасибо.


person Darshan Nair    schedule 11.07.2013    source источник
comment
local tbl="A.B.C.D" и (function(s,k)loadstring(s..('}'):rep(k))()end)((tbl..'.'):gsub('%.','={'))   -  person Egor Skriptunoff    schedule 11.07.2013


Ответы (2)


Очевидным решением было бы разобрать строку и построить из нее таблицу иерархии. Но более разумное решение — позволить 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 = {
        }
      }
    }
  }
}
person greatwolf    schedule 11.07.2013

Ответ @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"))
person catwell    schedule 11.07.2013
comment
Хороший. Просто обратите внимание, что A — это не таблица, возвращаемая createtable, а поле в этой таблице. - person lhf; 11.07.2013
comment
Да, я скопировал вывод @greatwolf. Если вы хотите вернуть A, вам просто нужно пропустить первую часть строки, например. изменив шаблон на "\.([^.]+)". - person catwell; 11.07.2013