我有问题,
我必须更改之前位于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"
但这不是我想要的方式!
我想动态更改它,以便我有一个函数可以更改主表'x'
中表'n'
的值'tbl'
。
有没有办法做到这一点?
答案 0 :(得分:0)
有了这样的问题,你可能应该重新考虑你的设计选择。您描述的n个表中的表类似于树图,其中字段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_id
之间的唯一区别是:
1)a
不太可读。
2)如果您知道a
,则不需要搜索它。
所以,看看你的问题,看看并问自己:
"这种需求来自哪里?为什么我不能得到unique_id
而不是一系列索引?为什么我无法获得box
本身而不是unique_id
?"