2016-06-19 14 views
0

Ich möchte einige Knoten im Baum zu finden, und ich brauche einen Zeiger auf den Behälter von Knoten: &mut Vec<Node>Wie mache ich einen veränderbaren Zeiger auf das Feld des Knoten des Baumes und mutiere es mutieren?

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, 
    }); 
} 

Antwort

2

Sie benötigen eine temporäre Variable, die borrow checker zu beruhigen:

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

Or :

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

Danke. Ich kann nicht verstehen, warum die Lebensdauer im Rost mit Klammern endet {}, denke ich, die Lebensdauer sollte dann enden, wenn diese Variable das letzte Mal benutzt wird. –

+0

@ J.Jerk Lebensdauer ist ein Zeitlimit einer Variablen, die mit der Zuordnung beginnt und mit der Freigabe endet. Der Deallokationsprozess findet statt, wenn die Variable ihren Gültigkeitsbereich verlässt. [Lesen Sie mehr] (https://doc.rust-lang.org/book/lifetimes.html#thinking-in-scopes) –

+0

@ J.Jerk Dies ist nicht lebenslangen Problem. Borrow Checker denkt, dass "p" hier von sich selbst geliehen wird: 'p = & mut p [0] .c'. Nachdem das 'p' gesperrt wurde, kannst du nichts mehr damit machen. Das Ersetzen von "p" durch temporäre Variable ermöglicht es, eine Selbsthemmung zu vermeiden. – aSpex