Lua层级字符串转换为表格

5

有没有一种方法可以将层次字符串转换为表格形式?

假设输入是A.B.C.D

输出应该是遍历上述输入的表格: A = {} A.B = {} A.B.C = {} A.B.C.D = {}

谢谢。


本地 tbl="A.B.C.D" 和 (function(s,k)loadstring(s..('}'):rep(k))()end)((tbl..'.'):gsub('%.','={')) - Egor Skriptunoff
2个回答

5
明显的解决方案是将字符串解析并从中构建层次表。但更聪明的解决方案是让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 = {
        }
      }
    }
  }
}

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

2
好的。请注意,A 不是 createtable 返回的表格,而是该表格中的一个字段。 - lhf
是的,我复制了@greatwolf的输出。如果你想返回A,你只需要跳过字符串的第一部分,例如通过将模式更改为"\.([^.]+)" - catwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接