2016-10-27 4 views
2

У меня есть циклическая графоподобная структура, где узлы ссылаются на другие узлы. Для краткости я кое-что убрал. Я еще только начинаю изучать ржавчину, и я использовал Rust borrowed pointers and lifetimes и https://github.com/nrc/r4cppp/blob/master/graphs/src/rc_graph.rs как ссылкиЦиклическая ссылка не достаточно продолжительная.

use std::cell::RefCell; 
use std::rc::*; 

fn main() { 
    let node1 = Node::new(1); 
    let node0 = Node::new(0); 

    node0.borrow_mut().parent = Some(node1.clone()); 
    node1.borrow_mut().parent = Some(node0.clone()); 

    //works 
    println!("Value of node0: {}", node0.borrow().value); 

    //neither of the following work 
    println!("Value of node0.parent: {}", node0.borrow().parent.as_ref().unwrap().borrow().value); 
    println!("Value of node0: {}", node0.borrow().get_parent().borrow().value); 
} 

struct Node { 
    value: i32, 
    parent: Option<Rc<RefCell<Node>>> 
} 

impl Node{ 

    fn new(val: i32) -> Rc<RefCell<Node>> { 
     Rc::new(RefCell::new(Node { 
      value: val, 
      parent: None 
     })) 
    } 


    fn get_parent(&self) -> Rc<RefCell<Node>> { 
     self.parent.as_ref().unwrap().clone() 
    } 
} 

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

16 |  println!("Value of node0.parent: {}", node0.borrow().parent.as_ref().unwrap().borrow().value); 
    |           ^^^^^^^^^^^^^^ does not live long enough 

и

17 |  println!("Value of node0: {}", node0.borrow().get_parent().borrow().value); 
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough 

Что я делаю неправильно?

ответ

2

Вам нужно разделить заимствует из самых println! звонков:

// Borrow them separately, so their scopes are larger. 
let n0_borrowed = node0.borrow(); 
let n1_borrowed = node1.borrow(); 
let n0_parent = n0_borrowed.parent.as_ref().unwrap(); 
let n1_parent = n1_borrowed.parent.as_ref().unwrap(); 

println!("Value of node0: {}", node0.borrow().value); 
println!("Value of node0.parent: {}", n0_parent.borrow().value); 

println!("Value of node1: {}",node1.borrow().value); 
println!("Value of node1.parent: {}", n1_parent.borrow().value); 

Here it is running in the Playground.

По существу, заимствованные ссылки не достаточно долго живут, когда вы связываете все звонки вместе. Разделение их увеличивает их объем, и они живут дольше.

+1

Я знаю, что вы уже приняли это, но я обновил пример игровой площадки, чтобы разделить каждый заем. Надеюсь, это поможет немного больше. –

+0

Ха, это было намного проще, чем я ожидал. Спасибо! – Newtang

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