方法是与结构体(struct)、枚举(enum)或特征(trait)关联的特殊函数,
相当于为类添加方法
。
方法通过 impl
关键字定义,第一个参数通常是 &self
,表示调用这个方法的实例。方法可以用点号(.)调用,类似其他语言中的对象方法。
Rust 的方法有几个关键特点:
- 与类型绑定:方法属于某个特定类型,而不是独立存在。
- 借用实例:通过 &self,方法可以安全访问实例的数据。
- 灵活调用:既能操作实例,也能定义不依赖实例的“关联函数”。
方法和普通函数有什么区别?简单来说,方法绑定到类型,在 impl 块中定义,靠 &self 访问实例,用.调用;而函数独立存在,不需要实例,直接用函数名调用。让我们从一个例子入手,感受一下。
结构体方法
struct Spaceship {
fuel: u32,
speed: u32,
}
impl Spaceship {
// 关联函数:创建一艘新飞船
fn new(fuel: u32) -> Spaceship {
Spaceship { fuel, speed: 0 }
}
// 方法:报告状态
fn status(&self) {
println!("飞船状态 - 燃料: {}, 速度: {}", self.fuel, self.speed);
}
// 方法:加速,增加速度并消耗燃料,需要修改数据,需要使用mut
fn accelerate(&mut self) {
if self.fuel > 0 {
self.speed += 10;
self.fuel -= 5;
}
}
// 方法:检查剩余燃料
fn fuel_left(&self) -> u32 {
self.fuel
}
}
fn main() {
let mut ship = Spaceship::new(50); // 用关联函数创建实例
ship.status();
ship.accelerate();
println!("剩余燃料:{},速度:{}", ship.fuel_left(), ship.speed)
}
枚举方法
enum Command {
Launch, // 起飞
Land, // 降落
Report(String), // 报告信息
}
impl Command {
fn execute(&self) {
match self {
Command::Launch => println!("飞船起飞!"),
Command::Land => println!("飞船降落!"),
Command::Report(msg) => println!("报告: {}", msg),
}
}
}
fn main() {
let cmd1 = Command::Launch;
let cmd2 = Command::Report(String::from("燃料充足"));
cmd1.execute();
cmd2.execute();
}