Rust で Disjoint-Set データ構造を作成しようとしていました。関連するコードは次のとおりです。
pub struct Set<'a, T: 'a> {
rank: u32,
value: T,
parent: Option<&'a mut Set<'a, T>>,
}
impl<'a, T> Set<'a, T> {
pub fn find(&'a mut self) -> &'a mut Set<'a, T> {
match self.parent {
None => self,
Some(mut p) => {
self.parent = Some(p.find());
self.parent.unwrap()
}
}
}
}
私が得るエラーは次のとおりです。
error[E0507]: cannot move out of borrowed content
--> src/main.rs:9:15
|
9 | match self.parent {
| ^^^^ cannot move out of borrowed content
10 | None => self,
11 | Some(mut p) => {
| ----- hint: to prevent move, use `ref p` or `ref mut p`
error[E0507]: cannot move out of borrowed content
--> src/main.rs:13:17
|
13 | self.parent.unwrap()
| ^^^^ cannot move out of borrowed content
ボローチェッカーを完全に理解しているかどうかはわかりませんが、参照を使用して、構造体自体の所有権を取得しないようにして、他の言語と同じように構造体を指して再割り当てできるようにしています。
構造体の参照からを削除することでこれらのエラーを回避できますmut
が、各セットの親は不変であるため変更できません。
次のような同様の質問を読みました。
これらは、この問題を解決する方法を見つけるのに役立ちません。find
また、使用する構造体だけでなく関数も再構築しようとRc<RefCell<Set>>
しBox<Set>
ましたが、常に同じエラーが発生します。
このエラーは何ですか?どうすれば修正できますか?