&self
- 区别:这是对
self
的不可变引用。意味着在方法内部不能修改结构体的字段。
- 适用场景:当方法只需要读取结构体的状态,而不需要修改它时使用。
- 示例代码:
struct Point {
x: i32,
y: i32,
}
impl Point {
fn distance(&self, other: &Point) -> f64 {
let dx = (self.x - other.x) as f64;
let dy = (self.y - other.y) as f64;
(dx * dx + dy * dy).sqrt()
}
}
&mut self
- 区别:这是对
self
的可变引用。允许在方法内部修改结构体的字段。
- 适用场景:当方法需要改变结构体的状态时使用。
- 示例代码:
struct Counter {
value: i32,
}
impl Counter {
fn increment(&mut self) {
self.value += 1;
}
fn get_value(&self) -> i32 {
self.value
}
}
self
- 区别:这种方式会将所有权从调用者转移到方法内部。方法结束后,原调用者不能再使用该实例。
- 适用场景:当方法需要接管结构体的所有权,并且可能会在方法内对结构体进行移动、消耗或返回修改后的结构体时使用。
- 示例代码:
struct StringWrapper {
inner: String,
}
impl StringWrapper {
fn into_inner(self) -> String {
self.inner
}
}