我正在编写一个链表来了解 Rust 的生命周期、所有权和引用。我有以下代码:
pub struct LinkedList {
head: Option<Box<LinkedListNode>>,
}
pub struct LinkedListNode {
next: Option<Box<LinkedListNode>>,
}
impl LinkedList {
pub fn new() -> LinkedList {
LinkedList { head: None }
}
pub fn prepend_value(&mut self) {
let mut new_node = LinkedListNode { next: None };
match self.head {
Some(ref head) => new_node.next = Some(*head),
None => new_node.next = None,
};
self.head = Some(Box::new(new_node));
}
}
fn main() {}
但我收到以下编译错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:18:52
|
18 | Some(ref head) => new_node.next = Some(*head),
| ^^^^^ cannot move out of borrowed content
较新版本的 Rust 有一个稍微不同的错误:
error[E0507]: cannot move out of `*head` which is behind a shared reference
--> src/main.rs:18:52
|
18 | Some(ref head) => new_node.next = Some(*head),
| ^^^^^ move occurs because `*head` has type `std::boxed::Box<LinkedListNode>`, which does not implement the `Copy` trait
我认为该head
节点当前必须由 拥有self
,这是链表。当我将其分配给 时new_node.next
,可能会发生所有权变更。
如果可能的话,我宁愿不克隆该值,因为这似乎很浪费。我不想只是在函数期间“借用”它。我真的很想转让它的所有权。
我怎么做?
我已经看过在&mut self 方法中解包成员变量时无法移出借用的内容,以及无法移出借用的内容/无法移出共享引用的后面。
我尝试按照其中一个问题中接受的答案中的建议删除匹配臂,并next
在创建 new时进行定义LinkedListNode
,但我收到了相同的错误消息。
我已成功添加了一个append
方法,该方法需要将 aLinkedListNode
添加到列表的末尾。