У меня есть следующий код:
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
}
}
Rust Playground
Не удается скомпилировать с:
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
Однако, если я возвращаю Some(baz.x)
из Foo::foo
(и меняю тип возвращаемого значения на Option<usize>
), код компилируется. Это заставляет меня поверить, что проблема не в цикле, хотя компилятор, кажется, указывает на это. Более конкретно, я считаю, что локальная изменяемая ссылка baz
выйдет из области видимости на следующей итерации цикла, что приведет к тому, что это станет проблемой. В чем проблема срока службы вышеуказанного кода?
Следующие вопросы похожи:
Однако они имеют дело с явно объявленными временами жизни (и именно эти явные времена жизни являются частью ответа). Мой код пропускает эти времена жизни, поэтому удаление их не является решением.