self
作为值参数(self
):
- 这种方式会将结构体实例的值移动到方法中,方法可以修改结构体实例,但调用该方法后,原实例不能再被使用。
- 示例:
struct Point {
x: i32,
y: i32
}
impl Point {
fn move_to_origin(self) -> Point {
Point { x: 0, y: 0 }
}
}
fn main() {
let mut p = Point { x: 10, y: 20 };
let new_p = p.move_to_origin();
// 这里p不能再被使用,因为它的值已经移动到move_to_origin方法中
}
self
作为可变引用(&mut self
):
- 这种方式允许方法修改结构体的内部状态,同时结构体实例在方法调用后仍可使用。
- 示例:
struct Point {
x: i32,
y: i32
}
impl Point {
fn increment(&mut self) {
self.x += 1;
self.y += 1;
}
}
fn main() {
let mut p = Point { x: 10, y: 20 };
p.increment();
println!("x: {}, y: {}", p.x, p.y);
}
self
作为不可变引用(&self
):
- 这种方式用于方法只需要读取结构体的状态,而不需要修改它。
- 示例:
struct Point {
x: i32,
y: i32
}
impl Point {
fn distance_from_origin(&self) -> f64 {
(self.x.pow(2) + self.y.pow(2)) as f64).sqrt()
}
}
fn main() {
let p = Point { x: 3, y: 4 };
let dist = p.distance_from_origin();
println!("Distance from origin: {}", dist);
}