2016-06-05 5 views
2

Hier ist mein Code:Fehler: kann nicht von geliehenen Inhaltsfeld für Selbst ausrücken

struct Node<T> { 
    data: T, 
    next: Option<Box<Node<T>>>, 
} 

impl<T> Node<T> { 
    fn new(data : T) -> Node<T> { 
     Node { data: data, next: None } 
    } 
    fn new_with_next(data: T, next: Option<Box<Node<T>>>) -> Node<T> { 
     Node { data: data, next: next } 
    } 
} 


struct LinkedList<T> { 
    head: Box<Node<T>>, 
    size: u8, 
} 

impl<T> LinkedList<T> { 
    fn new(data: T) -> LinkedList<T> { 
     let new_node = Node::new(data); 
     let head = Box::new(new_node); 
     LinkedList { head: head, size: 1 } 
    } 
    fn insert(&mut self, data: T) { 
     let mut next = Some(self.head); // <-- error here 
     let new_node = Node::new_with_next(data, next); 
     self.head = Box::new(new_node); 
     self.size += 1; 
    } 
} 

ich diesen Fehler:

src\linked_list.rs:28:29: 28:33 error: cannot move out of borrowed content [E0507] 
src\linked_list.rs:28   let next = Some(self.head); 
               ^~~~ 

Ich verstehe nicht den Fehler, noch wie sie beheben es. Ich habe versucht, einen Verweis auf self.head zu Some geben, aber ich ändere den Datentyp dieses innerhalb Some auf diese Weise.

Antwort

6

Das Problem ist, dass Sie self per Referenz nehmen, daher können Sie nicht head ausziehen (es würde ungültig werden), die let mut next = Some(self.head); tun würde.

std::mem::replace ist eine nette Funktion dafür:

fn insert(&mut self, data: T) { 
    let mut next = std::mem::replace(&mut self.head, Box::new(Node::new(data))); 
    self.head.next = Some(next); 
    self.size += 1; 
} 

Es Sie den Kopf mit einem neuen Knoten ersetzen können und die alte zugleich, erhalten die Rust glücklich über weil head Aufenthalte ist die ganze Zeit gültig.

Verwandte Themen