面试题答案
一键面试借用规则
- 同一时间只能有一个可变引用:这确保了在任何时刻只有一个代码部分可以修改数据,避免数据竞争。
- 不可变引用和可变引用不能同时存在:不可变引用允许读取数据,可变引用允许修改数据。同时存在两者可能导致读 - 写或写 - 写冲突。
示例代码
struct MyStruct {
data: i32,
}
fn main() {
let mut s = MyStruct { data: 42 };
// 可变借用
let mut ref1 = &mut s.data;
*ref1 = 43;
// 这里不能再有其他对 s.data 的借用,否则会报错
// 不可变借用
let ref2 = &s.data;
println!("Data: {}", ref2);
// 此时不能有对 s.data 的可变借用,否则会报错
}
可能遇到的借用错误及其原因
- 双重可变借用错误:
struct MyStruct {
data: i32,
}
fn main() {
let mut s = MyStruct { data: 42 };
let ref1 = &mut s.data;
let ref2 = &mut s.data; // 错误:不能在 `ref1` 有效时创建另一个可变引用 `ref2`
*ref1 = 43;
*ref2 = 44;
}
原因:违反了“同一时间只能有一个可变引用”的规则,可能导致数据竞争。
- 可变与不可变借用同时存在错误:
struct MyStruct {
data: i32,
}
fn main() {
let mut s = MyStruct { data: 42 };
let ref1 = &s.data;
let ref2 = &mut s.data; // 错误:不能在 `ref1`(不可变引用)有效时创建可变引用 `ref2`
*ref2 = 43;
}
原因:违反了“不可变引用和可变引用不能同时存在”的规则,可能导致数据不一致问题。