【Rust】结构体的方法语法

目录

思维导图

[1. 方法语法概述](#1. 方法语法概述)

[2. 方法与函数的区别](#2. 方法与函数的区别)

[2.1 示例:定义方法](#2.1 示例:定义方法)

[3. 方法的参数](#3. 方法的参数)

[3.1 示例:带参数的方法](#3.1 示例:带参数的方法)

[4. 关联函数](#4. 关联函数)

[4.1 示例:关联函数](#4.1 示例:关联函数)

[5. 多个impl块](#5. 多个impl块)

[5.1 示例](#5.1 示例)


思维导图

1. 方法语法概述

  • 方法是定义在结构体、枚举或特征对象(trait object)中的函数,与特定类型实例相关联。

  • 方法的第一个参数总是self,表示方法被调用的实例。self可以是以下三种形式之一:

  1. &self:不可变借用,表示方法不会修改实例。

  2. &mut self:可变借用,表示方法可能会修改实例。

  3. self:获取所有权,表示方法会消耗实例。

  • 方法通过impl(实现)块定义,所有在该块内的内容都与指定的类型相关联。

2. 方法与函数的区别

  • 方法 总是与某个类型实例相关联,调用语法为实例.方法名(参数)。

  • 函数 是独立的,调用语法为函数名(参数)。

2.1 示例:定义方法

以下示例展示了如何在Rectangle结构体上定义area方法,计算矩形的面积。

rust 复制代码
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

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

fn main() {
    let rect = Rectangle {
        width: 30,
        height: 50,
    };
    println!("The area of the rectangle is {} square pixels.", rect.area());
}

输出结果:

rust 复制代码
The area of the rectangle is 1500 square pixels.

3. 方法的参数

  • 方法可以有多个参数,除了第一个self参数外,其他参数与函数的参数定义方式相同。

  • 以下示例定义了can_hold方法,用于判断一个矩形是否可以容纳另一个矩形。

3.1 示例:带参数的方法

rust 复制代码
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // 定义方法:判断当前矩形是否可以容纳另一个矩形
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    let rect2 = Rectangle {
        width: 20,
        height: 40,
    };
    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
}

输出结果:

rust 复制代码
Can rect1 hold rect2? true

4. 关联函数

  • 关联函数 是定义在impl块内但不需要self参数的函数,通常用于构造函数。

  • 关联函数通过类型名::函数名的方式调用。

4.1 示例:关联函数

rust 复制代码
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // 定义关联函数:创建一个正方形矩形
    fn square(size: u32) -> Self {
        Self {
            width: size,
            height: size,
        }
    }
}

fn main() {
    let square = Rectangle::square(10);
    println!("Square: {:?}", square);
}

输出结果:

rust 复制代码
Square: Rectangle { width: 10, height: 10 }

5. 多个impl块

  • Rust允许为同一结构体定义多个impl块,这在某些情况下是有用的,例如为不同的功能组织代码。

5.1 示例:多个impl块

rust 复制代码
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

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

impl Rectangle {
    // 定义方法:判断当前矩形是否可以容纳另一个矩形
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    let rect2 = Rectangle {
        width: 20,
        height: 40,
    };
    println!("Area of rect1: {}", rect1.area());
    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
}

输出结果:

rust 复制代码
Area of rect1: 1500
Can rect1 hold rect2? true

tips:

  • 方法第一个参数总是 self ,可选 &self&mut selfself
  • 方法通过 impl 块定义,调用语法为 实例.方法名(参数)
  • 关联函数不含 self 参数,调用语法为 类型名::函数名
  • Rust允许为同一结构体定义多个 impl 块。
相关推荐
毕设源码-邱学长16 小时前
【开题答辩全过程】以 基于PHP的发热病人管理平台的设计与实现为例,包含答辩的问题和答案
开发语言·php
HellowAmy16 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范
独自破碎E16 小时前
【BISHI9】田忌赛马
android·java·开发语言
czy878747516 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
范纹杉想快点毕业16 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
马猴烧酒.17 小时前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
以卿a17 小时前
C++(继承)
开发语言·c++·算法
lly20240617 小时前
XQuery 选择和过滤
开发语言
测试工程师成长之路17 小时前
Serenity BDD 框架:Java + Selenium 全面指南(2026 最新)
java·开发语言·selenium
czxyvX18 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++