Этот код не проходит проверку страшного заимствования (игровая площадка):
struct Data {
a: i32,
b: i32,
c: i32,
}
impl Data {
fn reference_to_a(&mut self) -> &i32 {
self.c = 1;
&self.a
}
fn get_b(&self) -> i32 {
self.b
}
}
fn main() {
let mut dat = Data{ a: 1, b: 2, c: 3 };
let aref = dat.reference_to_a();
println!("{}", dat.get_b());
}
Ошибка:
error[E0502]: cannot borrow 'dat' as immutable because it is also borrowed as mutable
--> <anon>:19:20
|
18 | let aref = dat.reference_to_a();
| --- mutable borrow occurs here
19 | println!("{}", dat.get_b());
| ^^^ immutable borrow occurs here
20 | }
| - mutable borrow ends here
Может кто-нибудь объяснить, почему это так? Я бы подумал, что изменяемый заем dat
преобразуется в неизменяемый при возврате reference_to_a()
, потому что эта функция возвращает только неизменяемую ссылку. Является ли проверка заимствований еще недостаточно умной? Это запланировано? Есть ли способ обойти это?