3.1 方法

01-方法 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/methods-and-traits/methods.html

3.1 方法

Rust 允许把函数与你的新类型关联起来。做法是写一个 impl 块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[derive(Debug)]
struct CarRace {
    name: String,
    laps: Vec<i32>,
}

impl CarRace {
    // 无接收者,静态方法
    fn new(name: &str) -> Self {
        Self { name: String::from(name), laps: Vec::new() }
    }

    // 对 self 的独占、可读写借用
    fn add_lap(&mut self, lap: i32) {
        self.laps.push(lap);
    }

    // 对 self 的共享、只读借用
    fn print_laps(&self) {
        println!("Recorded {} laps for {}:", self.laps.len(), self.name);
        for (idx, lap) in self.laps.iter().enumerate() {
            println!("Lap {idx}: {lap} sec");
        }
    }

    // 独占取得 self 的所有权(后面会讲)
    fn finish(self) {
        let total: i32 = self.laps.iter().sum();
        println!("Race {} is finished, total lap time: {}", self.name, total);
    }
}

fn main() {
    let mut race = CarRace::new("Monaco Grand Prix");
    race.add_lap(70);
    race.add_lap(68);
    race.print_laps();
    race.add_lap(71);
    race.print_laps();
    race.finish();
    // race.add_lap(42);
}

self 参数指定「接收者」——方法作用的对象。方法常见的几种接收者:

  • &self:用共享、不可变引用从调用方借用对象。之后对象仍可继续使用。
  • &mut self:用唯一、可变引用从调用方借用对象。之后对象仍可继续使用。
  • self:取得对象所有权并从调用方移走。方法成为对象的所有者。方法返回时对象会被丢弃(释放),除非所有权被显式传递出去。完全所有权并不自动意味着可变。
  • mut self:同上,但方法可以修改对象。
  • 无接收者:成为结构体上的静态方法。通常用于按约定名为 new 的构造函数。

要点:

  • 通过与函数对比来介绍方法会很有帮助。
    • 方法在类型实例(如结构体或枚举)上调用,第一个参数用 self 表示该实例。
    • 开发者可能选用方法以利用接收者语法,并让代码更有条理。用方法可以把实现集中放在可预期的位置。
    • 注意:也可以像关联函数那样显式传入接收者来调用方法,例如 CarRace::add_lap(&mut race, 20)。
  • 指出关键字 self,即方法接收者。
    • 说明它是 self: Self 的简写,也可以演示如何写出结构体名称。
    • 解释 Self 是 impl 块所在类型的别名,可在该块内其他地方使用。
    • 注意 self 的用法与其他结构体类似,可用点号访问各个字段。
    • 这可能是演示 &self 与 self 区别的好时机:试着调用两次 finish。
    • 除了 self 的各种变体,还允许一些 特殊包装类型 作为接收者类型,例如 Box<Self>。
最后修改 August 11, 2026: 更新 (70a5af133)