не может выйти из заимствованного содержимого при развертывании переменной-члена в методе & 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> но я всегда заканчиваю одной и той же ошибкой.

Что это за ошибка и как ее исправить?

Ответы на вопрос(2)

Ваш ответ на вопрос