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个表中的表类似于树形图,其中fieldbox
保存对子节点的引用
正如您的注释所述,您需要修改位于该树中动态路径上的节点。一个简单的功能显而易见:
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
?