我有以下代码:
use std::{borrow::BorrowMut, mem};
struct Node {
ele: i32,
next: List,
}
enum List {
Empty,
More(Box<Node>),
}
pub struct LinkedList {
head: List,
}
impl LinkedList {
pub fn new() -> Self {
LinkedList { head: List::Empty }
}
pub fn push(&mut self, value: i32) {
let new_node = Box::new(Node {
ele: value,
next: mem::replace(self.head.borrow_mut(), List::Empty),
});
self.head = List::More(new_node);
}
pub fn pop(&mut self) -> Option<i32> {
match mem::replace(self.head.borrow_mut(), List::Empty) {
List::Empty => None,
List::More(node) => { // node have type Box<Node>
self.head = node.next;
Some(node.ele)
}
}
}
}
但当我将List::More(node) => {
更改为List::More(ref node) => {
时,将产生错误:
error[E0507]: cannot move out of `node.next` which is behind a shared reference
--> src/first.rs:35:29
|
35 | self.head = node.next;
| ^^^^^^^^^ move occurs because `node.next` has type `List`, which does not implement the `Copy` trait
移动似乎发生在第35行。我的问题是:
- 在我更改之前是否发生了移动
- 为什么在我改变之前它有效
事实上,我在读";通过编写"链接列表太多"来学习Rust;。我注意到,在这次提交中,提交人将某些内容更改为rust 2018。这些变化似乎与我的问题有关。
self.head
的类型为List
,如struct List { ... }
中所声明的。因此,必须将拥有的List
分配给self.head
。&List
和&mut List
不是所有者,而是引用。因此,在分配给self.head
时,您必须拥有想要分配的值的所有权。如果将匹配臂更改为List::More(ref node) => {
,则node
的类型为&List
,它是引用,不是一个拥有的值,因此不可分配给self.head
。