struct Point {
x: i32,
y: i32,
}
// 修改字段的函数
fn modify_point(point: &mut Point) {
point.x = 10;
}
// 读取所有字段的函数
fn read_point(point: &Point) {
println!("x: {}, y: {}", point.x, point.y);
}
fn main() {
let mut p = Point { x: 0, y: 0 };
modify_point(&mut p);
read_point(&p);
}
借用规则解释
- 唯一性:在任何给定的时间,对于特定数据,只能有一个可变引用(
&mut
),这确保了不会出现数据竞争。在modify_point
函数中,我们传入&mut Point
,这是对Point
结构体的可变引用。在这个可变引用存活期间,不能有其他任何引用(包括不可变引用&
)指向相同的数据。
- 不可变性:可以有多个不可变引用(
&
),但不能同时存在可变引用。在read_point
函数中,我们传入&Point
,这是不可变引用。多个函数可以同时读取数据,但在读取期间,数据不会被修改,从而保证了内存安全。
- 作用域:引用的作用域决定了它的生命周期。一旦引用离开其作用域,就不再有效。在
main
函数中,modify_point
调用结束后,可变引用的作用域结束,此时可以安全地创建不可变引用供read_point
使用,从而避免了数据竞争和内存安全问题。