2016-06-19 7 views
0

私は木にいくつかのノードを見つけたいと私は、ノードのコンテナへのポインタを必要とする:&mut Vec<Node>ツリーのノードのフィールドへのポインタを変更してそれを変更する方法はありますか?

struct Node { 
    c: Vec<Node>, 
    v: i32, 
} 

impl Node { 
    pub fn new(u: i32, n: Node) -> Node { 
     let mut no = Node { 
      c: Vec::new(), 
      v: u, 
     }; 

     no.c.push(n); 

     no 
    } 
} 

fn main() { 
    let mut a = Node::new(1, 
     Node::new(2, 
     Node::new(3, 
     Node::new(4, 
     Node::new(5, 
     Node { 
      c: Vec::new(), 
      v: 6, 
     }))))); 

    let mut p: &mut Vec<Node> = &mut a.c; 

    while p.len() > 0 { 
     p = &mut p[0].c; 
    } 

    p.push(Node { 
     c: Vec::new(), 
     v: 7, 
    }); 
} 

答えて

2

あなたが借りチェッカーを沈静化するために、一時的な変数が必要になります。

while p.len() > 0 { 
    let t = p; 
    p = &mut t[0].c; 
} 

か:

while p.len() > 0 { 
    p = &mut {p}[0].c; 
} 
+0

ありがとうございます。私は理解できません。なぜなら、寿命が括弧{}で終わっているのはなぜですか? –

+0

@ J.Jerk lifetimeは、割り当てから始まり、割り当て解除で終わる変数の時間制限です。割り当て解除プロセスは、変数がスコープから外れると発生します。 [続きを読む](https://doc.rust-lang.org/book/lifetimes.html#thinking-in-scopes) –

+0

@ J.Jerkこれは生涯の問題ではありません。 Borrowチェッカーは、 'p'は' p =&mut p [0] .c'というところで 'p'がそれ自身で借りていると考えています。その後、 'p'はロックされ、もう何もできません。 'p'を一時変数に置き換えることで、自己ロックを避けることができます。 – aSpex

関連する問題