Empréstimo mutável em um loop
Eu tenho o seguinte código:
struct Baz {
x: usize,
y: usize,
}
struct Bar {
baz: Baz,
}
impl Bar {
fn get_baz_mut(&mut self) -> &mut Baz {
&mut self.baz
}
}
struct Foo {
bar: Bar,
}
impl Foo {
fn foo(&mut self) -> Option<&mut Baz> {
for i in 0..4 {
let baz = self.bar.get_baz_mut();
if baz.x == 0 {
return Some(baz);
}
}
None
}
}
Falha ao compilar com:
error[E0499]: cannot borrow `self.bar` as mutable more than once at a time
--> src/main.rs:23:23
|
23 | let baz = self.bar.get_baz_mut();
| ^^^^^^^^ mutable borrow starts here in previous iteration of loop
...
29 | }
| - mutable borrow ends here
No entanto, se eu voltarSome(baz.x)
deFoo::foo
(e altere o tipo de retorno paraOption<usize>
), o código é compilado. Isso me faz acreditar que o problema não está no loop, embora o compilador pareça indicar isso. Mais especificamente, acredito que a referência mutável localbaz
ficaria fora do escopo na próxima iteração do loop, fazendo com que isso não fosse um problema. Qual é o problema da vida útil com o código acima?
As seguintes perguntas são semelhantes:
Empréstimo mutável em loopVinculando a vida do eu e uma referência no métodoNão é possível emprestar como mutável mais de uma vez por vez em um código - mas pode em outro muito semelhanteNo entanto, eles lidam com vidas explicitamente declaradas (e especificamente essas vidas explícitas fazem parte da resposta). Meu código omite essas vidas úteis, portanto removê-las não é uma solução.