面试题答案
一键面试Rust所有权系统的核心原则
- 所有权:每个值都有一个变量作为其所有者。在任何时刻,一个值只能有一个所有者。
- 移动:当一个拥有值的变量离开其作用域时,该值将被销毁。如果将一个拥有值的变量赋值给另一个变量,所有权会发生转移(移动),原变量不再拥有该值。
- 借用:可以在不获取所有权的情况下,通过引用临时访问值。引用分为可变引用(
&mut
)和不可变引用(&
)。不可变引用允许多个同时存在,但可变引用在同一时间只能有一个。
防范数据竞争的方式
- 限制可变访问:由于同一时间只能有一个可变引用,这就防止了多个地方同时对数据进行修改,避免了“写 - 写”竞争。
- 避免悬空引用:当所有者变量离开作用域,其值被销毁,同时所有指向该值的引用也会失效,防止了“读 - 写”或“写 - 写”竞争中可能出现的悬空引用问题。
代码示例
fn main() {
let mut data = String::from("hello");
let reference1 = &data;
// 下面这行代码会报错,因为同时存在不可变引用reference1,不能创建可变引用
// let reference2 = &mut data;
println!("{}", reference1);
}
在上述代码中,如果取消注释let reference2 = &mut data;
这行代码,编译器会报错,提示在有不可变引用reference1
的情况下,不能创建可变引用reference2
,从而阻止了可能的数据竞争。