借用检查
Rust’s borrow checker puts constraints on the ways you can borrow values. For a given value, at any time:
- You can have one or more shared references to the value, or
- You can have exactly one exclusive reference to the value.
fn main() {
let mut a: i32 = 10;
let b: &i32 = &a;
{
let c: &mut i32 = &mut a;
*c = 20;
}
println!("a: {a}");
println!("b: {b}");
}
This slide should take about 10 minutes.
- 请注意,要求是相冲突的引用不能 同时存在。而引用的解引用位置无关紧要。
- 上述代码无法编译,因为
a
同时作为可变值(通过c
)和不可变值(通过b
)被借用。 - 将
b
的println!
语句移到引入c
的作用域之前,这段代码就可以编译。 - 这样更改后,编译器会发现
b
只在通过c
对a
进行新可变借用之前使用过。这是借用检查器的一个功能,名为“非词法作用域生命周期”。 - The exclusive reference constraint is quite strong. Rust uses it to ensure that data races do not occur. Rust also relies on this constraint to optimize code. For example, a value behind a shared reference can be safely cached in a register for the lifetime of that reference.
- 借用检查器专用于处理许多常见模式,例如同时对结构体中的不同字段进行独占引用。但在某些情况下,它并不能完全 “领会”您的意图,这往往会导致 “与借用检查器进行一番斗争”。