I'd like to have struct members that know their parent. This is approximately what I'm trying to do:
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);
}
I tried to appease the compiler with lifetimes without completely understanding what I was doing.
Here's the error message I'm stuck on:
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
That makes some sense, but I'm not at all sure where to go from here.
It is not possible to create cyclic structures with borrowed pointers.
There is not any good way of achieving cyclic data structures at present; the only real solutions are:
Rc<T>
with a cyclic structure with Rc::new
and Rc:downgrade
. Read the rc
module documentation and be careful to not create cyclic structures that use strong references, as these will cause memory leaks.*T
).