не может выйти из заимствованного содержимого при развертывании переменной-члена в методе & mut self
Я пытался создать структуру данных Disjoint-Set в Rust. Соответствующий код:
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
из ссылок в структуре, но тогда я не могу изменить родителя каждого набора, потому что они неизменны.
Я прочитал похожие вопросы, такие как:
Rust: ошибка «не могу выйти из себя», потому что она заимствована »Невозможно заимствовать файл из & mut self (ошибка msg: невозможно удалить заимствованный контент)Это не помогает мне решить, как решить эту проблему. Я также попытался реструктурировать функциюfind
а также сама структура для использованияRc<RefCell<Set>>
а такжеBox<Set>
но я всегда заканчиваю одной и той же ошибкой.
Что это за ошибка и как ее исправить?