Я пишу связанный список, чтобы разобраться в сроках жизни, владении и ссылках на 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
при создании нового LinkedListNode
, но получаю то же сообщение об ошибке.
Я успешно добавил append
метод, который требует LinkedListNode
, чтобы добавить его в конец списка.