Lua获取n层嵌套的表中的值

我有一个问题, 我必须更改一个已知表中的值,该表位于n个表中之前。 像这样的东西:

Box = {
        {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "这必须更改为测试",Box = {}}}}}}}}
    }

要更改这个,我可以使用硬编码:

Box[1].Box[1].Box[1].Box[1].Name = "更改"

但这不是我想要的方式! 我想要动态更改这个,这样我就有一个函数可以更改主表'tbl'中表'n'的值'x'。

有没有办法做到这一点?

点赞
用户4687565
用户4687565

如果遇到这样的问题,您可能应该重新考虑设计选择。您描述的n个表中的那个表,类似于一个树形图,其中字段‘box’保存了子节点的引用。

正如您的注释所述,您需要在该树中动态路径上修改节点。一个简单的函数很明显:

local function follow_path(start_node, path,i)
  --将起始节点和要跟踪的索引数组传递进去
  --返回在此路径上存储的盒子树中的表
  --i用于内部递归
  i=i or 1
  if not path[i] then
    return start_node
  else
    local new_start=start[path[i]]
    assert(new_start,"该路径上没有节点")
    return follow_path(new_start,path,i+1)
  end
end
local function follow_path_and_rename(start_node,path,field_name,new_value)
  local box = follow_path( start_node,path)
  box[field_name] = new_value
end

但是,根据您需要修改具有动态路径的节点的原因,可能会有更可靠的方法。从未有所伤的一件事是在创建时为每个盒子分配一个唯一标识符:

local new_box
do
 local box_count=0
 new_box = function(name)
  box_count=box_count+1
  local box = {
   unique_id=box_count,
   name=name,
   box={}
  }
  return box
 end
end

这样,您可以创建索引表,在其中始终可以通过其ID访问您的盒子:

local index={}
local add_new_box = function(name)
  local box = new_box(name)
  index[ box.unique_id] = box
  return box
end

或者如果不可接受,您可以在树的节点中搜索保证具有唯一值的节点。

但问题在于:所有的表都已经有唯一的标识符。那是它们的地址,即a = {}时分配给a的值。unique_id与此的唯一区别是:

  1. a不够易读。
  2. 如果您知道a,则无需搜索它。

因此,请查看您的问题,请查看并问自己: “这个需求来自哪里?为什么我不能得到unique_id而不是索引序列?为什么我不能得到盒子本身而不是unique_id?”

2017-09-10 09:35:56