2016-10-27 5 views
2

私はノードが他のノードを参照する循環グラフのような構造を持っています。私は簡潔にするためにいくつかのものを削除しました。循環参照が十分に長く生きていません

16 |  println!("Value of node0.parent: {}", node0.borrow().parent.as_ref().unwrap().borrow().value); 
    |           ^^^^^^^^^^^^^^ does not live long enough 
:私は出力にノードの親の価値をしようとしているが、私は次のようにコンパイルエラーを取得する私はまだちょうど錆を学ぶために始めている、と私は参照

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を使用しました

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

私はすでにこれを受け入れていることを知っていますが、Playgroundの例を更新して、それぞれの借り入れを分割しています。うまくいけばそれはもう少し役立ちます。 –

+0

ハ、それは私が予想していたよりずっと簡単でした。ありがとうございました! – Newtang

関連する問題