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)
相关推荐
Kiling_07043 分钟前
Java IO流:字节流实战与性能优化
java·开发语言·php
ConardLi6 分钟前
啊?我刚开源的 Skills 已经 7K Star 了?!
前端·人工智能·后端
糯米团子74914 分钟前
javascript高频知识点
开发语言·前端·javascript
道友可好24 分钟前
Git Worktree:一个仓库,多个分身
前端·后端·程序员
Wonderful U28 分钟前
基于Python+Django的在线题库与智能阅卷系统:从痛点分析到完整实现
开发语言·python·django
码语智行28 分钟前
拦截器、接口限流、过滤器、防重发/幂等性功能说明
开发语言·网络·python
liulilittle32 分钟前
麻将牌堆渲染(Lua)
开发语言·lua
鱼鳞_34 分钟前
苍穹外卖-Day10(Spring task)
java·后端·spring
我是一颗柠檬38 分钟前
【Redis】事务与Lua脚本Day7(2026年)
数据库·redis·后端·lua·database
雨落在了我的手上42 分钟前
初始java(十七):常⽤⼯具类介绍
java·开发语言