树状结构中对父项的可变引用

Mutable reference to parent in tree-like structure

提问人:jiwopene 提问时间:1/2/2023 最后编辑:jiwopene 更新时间:1/2/2023 访问量:292

问:

我正在开发一个对树结构执行操作的 Rust 程序,我们称之为 .不需要存储每个节点的子节点列表,但需要能够从任何其他节点返回到父节点。假设结构不可变,则可能如下所示:Nodestruct 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 在也会破坏它们的函数中实例化。我正在尝试找到不需要堆分配它们的解决方案,但如果这不容易,我可以忍受使用 .NodeRc

不变性 借用检查器 可变

评论

0赞 jiwopene 1/2/2023
@ChayimFriedman,可能没有,但我会看看。另请注意,我只想在子→父方向存储引用。
0赞 Chayim Friedman 1/2/2023
您不存储从父项到子项的引用?如果是这样,则不相关。
0赞 jiwopene 1/2/2023
@ChayimFriedman,不,我只需要存储对父级的引用,我总是从最深的级别遍历树。
0赞 jiwopene 1/2/2023
添加了更多信息。

答:

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 如果节点都构造在一个函数中,它将起作用。并且更喜欢将属性放入(如果可能)到 .CellRefCell