Я хотел бы иметь членов структуры, которые знают их родителей. Это примерно то, что я пытаюсь сделать:Какое время жизни я использую для создания структур 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);
}
Я попытался успокоить компилятор с временем жизни, не совсем понимая, что я делаю.
Вот сообщение об ошибке, я застрял на:
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
Это имеет некоторый смысл, но я не уверен, куда идти отсюда.
Thanks; очень хорошо знать. Наверное, я посмотрю, смогу ли я реорганизовать ум в дочерний элемент до родителя и избавиться от необходимости указателя родителя. – Grumdrig
Собственно, эта идея - небольшой кошмар, а '* T' кажется именно тем, что я хочу. Но я не могу использовать его для доступа к членам родителя. Когда я пытаюсь использовать 'c1.parent.i' (если у родителя есть поле' i: int', не показанное в моем примере), я получаю 'error: попытка доступа к полю 'i' по типу '* Parent', но не найдено ни одного поля с этим именем'. Я не могу найти много информации об этих зверях. – Grumdrig
Ничего. Ржавчина не автоматизирует сахаризацию небезопасных указателей, поэтому '(* c1.parent) .i' работает (в блоке' unsafe'). – Grumdrig