这段代码未能通过令人头疼的借用检查器 (playground):
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());
}
自从非词汇生命周期被实现以来,需要触发错误:
fn main() {
let mut dat = Data { a: 1, b: 2, c: 3 };
let aref = dat.reference_to_a();
let b = dat.get_b();
println!("{:?}, {}", aref, 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
为什么会这样呢?我原以为,当reference_to_a()
返回时,对dat
的可变借用将转换为不可变借用,因为该函数只返回一个不可变引用。难道借用检查器还不够聪明吗?是计划中的吗?有没有解决方法?
loan
的生命周期。https://play.rust-lang.org/?gist=fc564b89ff4fa44ae5463d7f407e88ca&version=stable&backtrace=0 - aSpex