错误:无法移动借用的内容,因为自身字段

3

这是我的代码:

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

I get this error:

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);
                                              ^~~~

我不理解这个错误,也不知道如何解决它。我尝试将self.head引用传递给Some,但是在Some中我更改了数据类型。
1个回答

9
问题在于你把 self 作为引用传递,因此你不能移出它的 head(否则它会变得无效),而这正是 let mut next = Some(self.head); 所做的。std::mem::replace 是一个不错的函数来解决这个问题。
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;
}

它允许您同时替换头部为新节点并获取旧节点,这让Rust感到高兴,因为现在“head”始终有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接