面试题答案
一键面试Rust中共享所有权机制下引用的三条核心规则
- 在任何给定时间,要么只能有一个可变引用,要么可以有多个不可变引用:这确保了数据不会同时被多个地方修改,避免数据竞争。例如,如果有多个不可变引用,它们都只能读取数据,不会互相干扰;而可变引用则独占对数据的修改权。
- 引用必须总是有效的:在Rust中,不能创建悬空引用,即引用不会指向无效的内存位置。当引用所指向的数据被释放时,引用也不能再被使用。
- 不可变引用和可变引用不能同时存在:这防止了在有不可变引用读取数据时,可变引用对数据进行修改,从而破坏数据的一致性。
实际编程示例
fn main() {
let s = String::from("hello");
// 多个不可变引用
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
// 尝试创建可变引用时,如果此时有不可变引用存在则会报错
// let mut r3 = &mut s; // 此行会报错,因为r1和r2仍然有效
{
// 创建一个新的作用域
let mut r3 = &mut s;
r3.push_str(", world");
println!("{}", r3);
}
// r3离开作用域,现在可以再次创建不可变引用
let r4 = &s;
println!("{}", r4);
}
在上述代码中,首先创建了两个不可变引用 r1
和 r2
来访问字符串 s
。然后尝试创建可变引用 r3
时会报错,因为此时不可变引用 r1
和 r2
仍然有效。通过创建新的作用域,在其中创建可变引用 r3
,对字符串进行修改,修改完成后 r3
离开作用域,又可以创建新的不可变引用 r4
来访问修改后的字符串。这样就利用引用在保证内存安全的前提下,实现了多个变量对同一数据的访问。