面试题答案
一键面试Rust借用规则核心要点
- 同一作用域内,可变借用只能有一个:这确保在任何时刻,只有一个地方可以对数据进行修改,避免多个修改操作同时进行导致数据竞争。
- 不可变借用可以有多个,但不能与可变借用同时存在:多个不可变借用可以同时存在,因为它们都只是读取数据,不会修改数据,所以不会引发数据竞争。但如果存在可变借用,就不允许有不可变借用,以防止在修改数据时,其他地方读取到不一致的数据。
- 借用的生命周期必须在被借用数据的生命周期之内:这保证了借用的数据在其有效生命周期内被使用,不会出现悬空指针(dangling pointer)的情况。
代码示例
fn main() {
let mut data = String::from("hello");
// 尝试创建可变借用
let mut borrow1 = &mut data;
// 下面这行代码会报错,因为在可变借用borrow1存在时,不能再创建不可变借用
// let borrow2 = &data;
borrow1.push_str(", world");
println!("{}", borrow1);
// 这里borrow1的作用域结束,data上的可变借用被释放
}
在这个示例中,首先创建了一个可变借用borrow1
,此时不能再创建对data
的不可变借用。borrow1
可以安全地修改data
,当borrow1
离开其作用域后,data
上的可变借用被释放,此时又可以对data
进行新的借用操作。这样通过借用规则有效地防止了数据竞争。