锈蚀箱子并移动



我有以下代码:

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

相关内容

  • 没有找到相关文章

最新更新