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 メソッドでメンバー変数をアンラップするときに、借用したコンテンツから移動できないおよび借用したコンテンツから移動できない / 共有参照の背後から移動できないについては既に確認しました。
これらの質問の1つで受け入れられた回答で提案されているように、マッチアームを削除しnext
、新しいの作成で定義しようとしましLinkedListNode
たが、同じエラーメッセージが表示されます。
リストの最後に追加するappend
メソッドを正常に追加しました。LinkedListNode