Невозможно использовать как изменяемый более одного раза за раз в асинхронном коде с циклом

#loops #asynchronous #rust #lifetime

#циклы #асинхронный #Ржавчина #время жизни

Вопрос:

Что вызывает несколько одновременных изменяемых заимствований в этом коде? Я подозреваю, что это связано с <'a> объявленным типом F , потому что, если я удалю 'a из структуры, я смогу написать цикл просто отлично.

Это работает, но это не:

 struct F<'a> {
    i: u32,
    a: amp;'a mut u32,
}

impl<'a> F<'a> {
    async fn looper(self, x: amp;'a mut u32) -> F<'a> {
        let mut this = Some(self);

        loop {
            let me = this.take().unwrap();
            let new_me = me.inner(x).await;
            this.replace(new_me);
        }
    }

    async fn inner(self, x: amp;'a mut u32) -> F<'a> {
        *x  = self.i;
        self
    }
}
  

игровая площадка

 error[E0499]: cannot borrow `*x` as mutable more than once at a time
  --> src/lib.rs:12:35
   |
12 |             let new_me = me.inner(x).await;
   |                                   ^ mutable borrow starts here in previous iteration of loop
  

Комментарии:

1. Из вашего кода неясно, почему x и F<'a> для обоих требуется одинаковое время жизни, это обязательно? Например, play.rust-lang.org / … работает нормально

2. Мне нужно указать, что «x» имеет более длительный срок службы, чем F.a и сам F … F.a — это просто ссылка на что-то, что хранится внутри «x»

3. F.a — это просто ссылка на что-то, что хранится внутри «x» — если u32 является заменой для какого-либо другого типа, вы не можете сохранить ссылку на что-то, пока существует изменяемая ссылка.

4. Итак, вы говорите, что здесь есть 2 одновременных ссылки mut — один из F.a и, а «x» — другой? Если да, то как компилятор определяет, что F.a является ссылкой на что-то внутри X ? Я нигде не указывал это явно.

5. комментарий loganfsmyth — это решение вашей опубликованной проблемы, я просто предупреждал вас, что компилятор отклонит ваш код, если вы вызовете looper while self.a ссылки на что-то x .