在 Rust 中,对于可变引用 &mut T
,编译器会要求代码保证在引用生命周期内只有一个可变引用。而对于不可变引用 &T
,可以有多个不可变引用同时存在。如果在代码中同时存在了可变和不可变的引用,编译器会报错并提示“cannot borrow immutable borrowed content as mutable”。
以下是一个产生此错误的示例代码:
struct Person {
name: String,
age: u8,
}
fn print_person (p: &Person) {
println!("{} is {} years old.", p.name, p.age);
}
fn update_person (p: &mut Person) {
p.age += 1;
}
fn main() {
let mut john = Person { name: String::from("John"), age: 25 };
print_person(&john); // 正常
let john_imm = &john;
// let john_mut = &mut john; // 该行代码不能取消注释,否则会报错
update_person(&mut john); // 正常
}
因为在代码中同时出现了 john_imm
和 john_mut
两个引用,其中 john_mut
是可变引用,会导致错误的产生。要解决这个问题,有两种方法:
1.使用不可变引用代替可变引用。
示例代码:
fn main() {
let mut john = Person { name: String::from("John"), age: 25 };
print_person(&john); // 正常
let john_imm = &john;
// let john_mut = &mut john; // 该行代码不能取消注释,否则会报错
// 需要在 john_imm 生命周期结束之后才能更新 john
let john_mut = &mut john;
update_person(john_mut); // 正常
}
2.将代码分成两个独立的步