提问人:jiwopene 提问时间:1/2/2023 最后编辑:jiwopene 更新时间:1/2/2023 访问量:292
树状结构中对父项的可变引用
Mutable reference to parent in tree-like structure
问:
我正在开发一个对树结构执行操作的 Rust 程序,我们称之为 .不需要存储每个节点的子节点列表,但需要能够从任何其他节点返回到父节点。假设结构不可变,则可能如下所示:Node
struct Node
struct Node<'a> {
parent: Option<&'a Node<'a>>,
// ... node attributes ...
}
问题是我需要更改树。我有一个函数,可以接收叶节点并对树执行更改(仅更改节点属性,从不更改树结构)。它不仅需要更改叶节点属性,还需要更改节点父节点的属性。
它可能看起来像这样:
fn mutate_tree(leaf: &mut Node) {
leaf.attr1 = 42;
leaf.parent.unwrap().attr1 = 43;
}
我怎样才能设计允许这些修改(并获得对父节点的可变引用)?struct Node
我总是从最深处穿过这棵树,而不是相反的方向。
s 在也会破坏它们的函数中实例化。我正在尝试找到不需要堆分配它们的解决方案,但如果这不容易,我可以忍受使用 .Node
Rc
答:
0赞
Chayim Friedman
1/2/2023
#1
由于多个子项具有对同一父项的引用,因此需要 RefCell
:
struct Node<'a> {
parent: Option<&'a RefCell<Node<'a>>>,
// ... node attributes ...
}
fn mutate_tree(leaf: &mut Node) {
leaf.attr1 = 42;
leaf.parent.unwrap().borrow_mut().attr1 = 43;
}
评论
1赞
Kevin Reid
1/2/2023
这个结构声明将不起作用,因为它在一个不变的位置使用,就像 would 一样(不变性源于可变性,无论是否内部),并且构造树将失败。Playground 演示。也许只把属性放在 中,这样父关系就保持不可变和协变?'a
&'a mut Node<'a>
RefCell
0赞
Chayim Friedman
1/2/2023
@KevinReid 如果节点都构造在一个函数中,它将起作用。并且更喜欢将属性放入(如果可能)到 .Cell
RefCell
评论