我用什么生命周期创建相互引用的Rust结构?

Gru*_*rig 21 struct reference circular-reference rust

我想让结构成员知道他们的父母.这大约是我正在尝试做的事情:

struct Parent<'me> {
    children: Vec<Child<'me>>,
}

struct Child<'me> {
    parent: &'me Parent<'me>,
    i: i32,
}

fn main() {
    let mut p = Parent { children: vec![] };
    let c1 = Child { parent: &p, i: 1 };
    p.children.push(c1);
}
Run Code Online (Sandbox Code Playgroud)

我试图用生命周期来安抚编译器而不完全理解我在做什么.

这是我坚持的错误信息:

error[E0502]: cannot borrow `p.children` as mutable because `p` is also borrowed as immutable
  --> src/main.rs:13:5
   |
12 |     let c1 = Child { parent: &p, i: 1 };
   |                               - immutable borrow occurs here
13 |     p.children.push(c1);
   |     ^^^^^^^^^^ mutable borrow occurs here
14 | }
   | - immutable borrow ends here
Run Code Online (Sandbox Code Playgroud)

这有点道理,但我不确定从哪里开始.

Chr*_*gan 15

使用借用指针创建循环结构是不可能的.

目前没有任何实现循环数据结构的方法; 唯一真正的解决方案是:

  1. 使用引用计数与Rc<T>用具有环状结构Rc::newRc:downgrade.阅读rc模块文档并注意不要创建使用强引用的循环结构,因为这会导致内存泄漏.
  2. 使用原始/不安全指针(*T).

  • 如果子对象存储`std :: rc :: Weak`而不是`Rc`,它应该在没有`new_unchecked`的情况下工作正常,因为没有(强)循环引用. (3认同)