#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
whileself.a
ссылки на что-тоx
.