2013-12-20 2 views
15

Я хотел бы иметь членов структуры, которые знают их родителей. Это примерно то, что я пытаюсь сделать:Какое время жизни я использую для создания структур 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 

Это имеет некоторый смысл, но я не уверен, куда идти отсюда.

ответ

9

Невозможно создать циклические структуры с заимствованными указателями.

хорошее способ получения циклических структур данных в настоящее время; единственные реальные решения являются:

  1. Использовать подсчет ссылок с Rc<T> с циклической структурой с Rc::new и Rc:downgrade. Прочтите rc module documentation и будьте осторожны, чтобы не создавать циклические структуры, которые используют сильные ссылки, так как это приведет к утечкам памяти.
  2. Использование необработанных/небезопасных указателей (*T).
+0

Thanks; очень хорошо знать. Наверное, я посмотрю, смогу ли я реорганизовать ум в дочерний элемент до родителя и избавиться от необходимости указателя родителя. – Grumdrig

+0

Собственно, эта идея - небольшой кошмар, а '* T' кажется именно тем, что я хочу. Но я не могу использовать его для доступа к членам родителя. Когда я пытаюсь использовать 'c1.parent.i' (если у родителя есть поле' i: int', не показанное в моем примере), я получаю 'error: попытка доступа к полю 'i' по типу '* Parent', но не найдено ни одного поля с этим именем'. Я не могу найти много информации об этих зверях. – Grumdrig

+1

Ничего. Ржавчина не автоматизирует сахаризацию небезопасных указателей, поэтому '(* c1.parent) .i' работает (в блоке' unsafe'). – Grumdrig

Смежные вопросы