Rust方法速览:从self到impl

Rust 中没有 class,方法通过 impl 块定义在结构体 / 枚举 上,第一个参数必须是 self 相关形式。


1. 基本方法:&self(只读)

  • 不获取所有权,只读取字段

  • 最常用

    struct Rectangle {
    width: u32,
    height: u32,
    }

    impl Rectangle {
    // 方法:计算面积
    fn area(&self) -> u32 {
    self.width * self.height
    }
    }

    fn main() {
    let rect = Rectangle { width: 10, height: 20 };
    println!("{}", rect.area()); // 200
    }


2. 可变方法:&mut self(可修改)

需要修改实例时使用。

复制代码
impl Rectangle {
    fn set_width(&mut self, w: u32) {
        self.width = w;
    }
}

fn main() {
    let mut rect = Rectangle { width: 10, height: 20 };
    rect.set_width(30);
}

3. 拿走所有权:self

方法执行后实例不再可用,常用于消耗、转换实例。

复制代码
impl Rectangle {
    fn into_tuple(self) -> (u32, u32) {
        (self.width, self.height)
    }
}

4. 关联函数(无 self)

  • 不属于实例,属于类型

  • 常用作构造器 new

    impl Rectangle {
    fn new(w: u32, h: u32) -> Self {
    Rectangle { width: w, height: h }
    }
    }

    // 调用
    let r = Rectangle::new(10, 20);


5. 方法名与字段同名(访问器)

Rust 允许方法名和字段同名,调用时靠是否带括号区分。

复制代码
impl Rectangle {
    fn width(&self) -> u32 {
        self.width
    }
}

// 调用
r.width();  // 方法
r.width;    // 字段

常用于实现 getter,配合私有字段做封装。


6. 自动引用 / 解引用

调用方法时 Rust 会自动加 & / &mut,不用手动写:

复制代码
rect.area();
// 等价于
(&rect).area();

7. 多个 impl 块

同一个类型可以拆成多个 impl,方便代码组织。

复制代码
impl Rectangle { fn area(&self) -> u32 { ... } }
impl Rectangle { fn can_hold(&self, other: &Self) -> bool { ... } }

8. 枚举也能定义方法

复制代码
enum Shape {
    Rect(u32, u32),
    Circle(u32),
}

impl Shape {
    fn area(&self) -> u32 {
        match self {
            Shape::Rect(w, h) => w * h,
            Shape::Circle(r) => 3 * r * r,
        }
    }
}

速记

  • &self 只读(最常用)
  • &mut self 可修改
  • self 拿走所有权
  • ::new() 构造器(关联函数)
  • 方法 = 数据(struct/enum) + 行为(impl)
相关推荐
meilindehuzi_a5 小时前
从零理解并实现 RAG:用 LangChain.js 构建语义检索问答系统
开发语言·javascript·langchain
风流 少年5 小时前
Julia
开发语言·julia
江畔柳前堤5 小时前
GO01-Go 语言与主流编程语言深度对比
开发语言·人工智能·后端·微服务·云原生·golang·go
世界哪有真情6 小时前
拿人类意识卡 AI?等于用 bug 验收正式产品
前端·人工智能·后端
:-)6 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
GIS阵地7 小时前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
yaoxin5211238 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
阿里嘎多学长8 小时前
2026-07-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Csvn8 小时前
Day 3:LIKE 与模式匹配 — 让查询学会"模糊搜索"
后端·sql
花褪残红青杏小8 小时前
Rust图像处理第19节-RGB 色彩矩阵变换:矩阵 × 向量 = 像素变换
rust·webassembly·图形学