Ten kod nie bał sprawdzania pożyczyć (playground):Zmienna pożyczyć od siebie nie zmienia się na niezmiennej
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());
}
Błąd:
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
Może ktoś dokładnie wyjaśnić, dlaczego tak jest? Wydaje mi się, że zmienna zapożyczona z dat
jest przekształcana w niezmienną po powrocie, ponieważ funkcja ta zwraca tylko niezmienne odniesienie. Czy narzędzie wypożyczające nie jest jeszcze wystarczająco sprytne? Czy to jest planowane? Czy jest jakiś sposób obejścia tego?
[Limits of Lifetimes] (https://doc.rust-lang.org/nomicon/lifetime-mismatch.html). To jest dokładnie to samo. – aSpex
@Stargateur: Nie sądzę, że kod "desugared" ma na celu skompilować; to tylko dla zilustrowania. – Timmmm
@Stargateur: Nie, to nie pomaga. Konieczne jest ograniczenie czasu życia 'pożyczki' https://play.rust-lang.org/?gist=fc564b89ff4fa44ae5463d7f407e88ca&version=stable&backtrace=0 – aSpex