2016-10-27 4 views
2

노드가 다른 노드를 참조하는 순환 그래프와 같은 구조입니다. 간결함을 위해 몇 가지 물건을 제거했습니다. 나는 여전히 녹 내용을 시작하고있어, 나는순환 참조가 충분히 길지 않습니다.

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() 
    } 
} 

내가 출력 노드의 부모의 값을 시도하고 참조로 Rust borrowed pointers and lifetimeshttps://github.com/nrc/r4cppp/blob/master/graphs/src/rc_graph.rs을 사용하지만, 나는 다음과 같은 컴파일 오류를 얻을 :

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

관련 문제