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)
相关推荐
学长毕设3 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h3 小时前
c++ string
开发语言·c++
raindayinrain3 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的3 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao3 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的4 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的5 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”5 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
努力的小雨5 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
小王C语言5 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt