Rust借用规则具体内容
- 同一时间内,特定数据的可变借用只能有一个:这意味着不能在同一作用域内同时有多个可变引用指向同一数据。例如:
fn main() {
let mut num = 5;
let r1 = &mut num;
// 下面这行代码会报错,因为已经有一个可变引用r1
// let r2 = &mut num;
*r1 = 6;
println!("{}", num);
}
- 同一时间内,可以有多个不可变借用,但不能有可变借用:即可以有多个只读引用同时存在,但不能在有只读引用时存在可变引用。例如:
fn main() {
let num = 5;
let r1 = #
let r2 = #
println!("r1: {}, r2: {}", r1, r2);
// 下面这行代码会报错,因为已有不可变引用r1和r2
// let r3 = &mut num;
}
- 借用的生命周期必须小于等于被借用数据的生命周期:借用不能超过其所借用数据的存在时间。例如:
fn main() {
let result;
{
let num = 5;
// 这里result的生命周期期望长于num,会报错
// result = #
}
// println!("{}", result);
}
如何避免数据竞争
- 防止写 - 写竞争:由于同一时间只能有一个可变借用,就避免了多个地方同时尝试修改同一数据的情况。如果有两个可变引用同时修改数据,就会出现数据竞争问题。而Rust的规则强制同一时刻只有一个可变引用能修改数据,例如上述第一个例子,如果允许同时有
r1
和 r2
两个可变引用,它们同时修改 num
,就会导致数据竞争,Rust通过规则避免了这种情况。
- 防止读 - 写竞争:当存在不可变借用(读)时,不允许可变借用(写),这样就避免了在读取数据时数据被修改的情况。例如在第二个例子中,如果允许在有
r1
和 r2
不可变引用(读操作)时创建 r3
可变引用(写操作),那么读操作可能会读到不一致的数据,Rust通过规则避免了这种读 - 写竞争。