Невозможно заимствовать `*self` как неизменяемый, потому что он также заимствован как изменяемый

Как я могу сообщить средству проверки заимствования, что мой вызов не приведет к каким-либо «побочным» изменениям свойства вектора в этом конкретном случае.

struct Element {}

struct A {
    b: Vec<Element>,
    count: i32,
}

impl A {
    fn do_thing(&self) {
      // does thing without causing side-effects (ie: do some calculations using self.count)
    }
    
    fn do_thing_mut(&mut self) -> Option<&mut Element> {
       for el in self.b.iter_mut() {
            self.do_thing(); // <-- causes the error
            if condition_is_met {
              return Some(el);
            }
       }
       None
    }
}

В противном случае, что я могу делать неправильно здесь?

Почему вы хотите использовать iter_mut, а не iter()?

nohup 26.12.2022 18:40

Я хочу вернуть изменяемую ссылку для векторного элемента на основе заданного условия. Я обновлю код примера.

kaneda 26.12.2022 18:44
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я нашел более безопасный способ обойти это для тех, кому это может быть интересно. Я изменил способ итерации цикла for по индексу. Затем я возвращаю соответствующий элемент вектора, используя Vec::get_mut.

fn do_thing_mut(&mut self) -> Option<&mut Element>  {
   for el in self.b.iter() {
        self.do_thing();
        if condition_is_met {
            return self.b.get_mut(0);
        }
   }
   None
}

Другие вопросы по теме