Lua在n个表中获取一个表的值

Lua在n个表中获取一个表的值,lua,lua-table,Lua,Lua Table,我有个问题, 之前,我必须更改位于n表中的已知表中的值。 大概是这样的: Box = { {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "This must be change for the test",Box = {}}}}}}}} } 要更改此设置,我可以使用以下硬编码: Box[1].Box[1].Box[1].Box[1].Name = "Changed" 但这不是我想要的方式!

我有个问题, 之前,我必须更改位于
n
表中的已知表中的值。 大概是这样的:

Box = {
        {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "This must be change for the test",Box = {}}}}}}}}
    }
要更改此设置,我可以使用以下硬编码:

Box[1].Box[1].Box[1].Box[1].Name = "Changed"
但这不是我想要的方式! 我想动态地更改它,这样我就有一个函数可以更改主表
'tbl'
中表
'n'
的值
'x'


有什么方法可以做到这一点吗?

对于这样的问题,您可能应该重新考虑您的设计选择。您描述的n个表中的表类似于树形图,其中field
box
保存对子节点的引用

正如您的注释所述,您需要修改位于该树中动态路径上的节点。一个简单的功能显而易见:

local function follow_path(start_node, path,i)
  --takes start node and array of indices to follow
  --returns table that is stored in the box-tree at this path
  --i is for internal recursion
  i=i or 1
  if not path[i] then 
    return start_node
  else
    local new_start=start[path[i]]
    assert(new_start,"No node is on this path")
    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\u id
之间的唯一区别是: 1)
a
的可读性不太好。 2) 如果您知道
a
,则无需搜索它

所以,看看你的问题,看看并问问自己:
“这种需求从何而来?为什么我不能得到
unique\u id
而不是一系列索引?为什么我不能得到
框本身而不是
unique\u id
?”

对于这样的问题,您可能应该重新考虑您的设计选择。您描述的n个表中的表类似于树形图,其中field
box
保存对子节点的引用

正如您的注释所述,您需要修改位于该树中动态路径上的节点。一个简单的功能显而易见:

local function follow_path(start_node, path,i)
  --takes start node and array of indices to follow
  --returns table that is stored in the box-tree at this path
  --i is for internal recursion
  i=i or 1
  if not path[i] then 
    return start_node
  else
    local new_start=start[path[i]]
    assert(new_start,"No node is on this path")
    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\u id
之间的唯一区别是: 1)
a
的可读性不太好。 2) 如果您知道
a
,则无需搜索它

所以,看看你的问题,看看并问问自己:
“这种需求从何而来?为什么我不能得到
unique\u id
而不是一系列索引?为什么我不能得到
框本身而不是
unique\u id
?”

local t,n=\u G,4;对于j=1,n do t=t.Box[1]结束;t、 Name=“Changed”
@EgorSkriptunoff,这应该足够回答问题了;我测量;)@PaulKulchenko-但它很好地符合一行注释!:-)@这是一个很好的答案!现在谢谢你。但是如果一个盒子里有两张相同的桌子怎么办?有没有其他方法来设置这个。像
Box[1].Box[5].Box[2].Box[3].Name=“Changed”
@YoungFlyme-你事先知道序列
1,5,2,3
;对于j=1,n do t=t.Box[1]结束;t、 Name=“Changed”
@EgorSkriptunoff,这应该足够回答问题了;我测量;)@PaulKulchenko-但它很好地符合一行注释!:-)@这是一个很好的答案!现在谢谢你。但是如果一个盒子里有两张相同的桌子怎么办?有没有其他方法来设置这个。像
Box[1].Box[5].Box[2].Box[3].Name=“Changed”
@YoungFlyme-你事先知道序列
1,5,2,3