Rust结构体方法语法:让数据拥有行为

Rust 支持中文定义结构体、方法、函数、变量。

结构体(struct)不仅是数据的容器,还能通过方法(method)定义专属行为。Rust通过impl块将数据与操作紧密结合,配合derive(Debug)实现便捷调试。本文通过实际案例,带你探索结构体方法的奥秘。


一、基础方法语法

示例1:定义简单方法

#[derive(Debug)] // 启用Debug trait
struct 玩家 {
    名字: String,
    等级: u32,
}

impl 玩家 {
    // 实例方法:显示信息
    fn 显示信息(&self) {
        println!("玩家 {} (等级 {})", self.名字, self.等级);
    }

    // 关联函数:构造函数
    fn 新建(名字: &str) -> Self {
        玩家 {
            名字: 名字.to_string(),
            等级: 1,
        }
    }
}

fn main() {
    let 新玩家 = 玩家::新建("张三");
    新玩家.显示信息();
    println!("调试信息: {:?}", 新玩家); // 使用Debug输出
}

输出:

玩家 张三 (等级 1)
调试信息: 玩家 { 名字: "张三", 等级: 1 }

二、可变方法

使用&mut self参数可以修改结构体实例。

示例2:实现升级方法

#[derive(Debug)] // 启用Debug trait
struct 玩家 {
    名字: String,
    等级: u32,
}
impl 玩家 {
    fn 升级(&mut self) {
        self.等级 += 1;
        println!("{} 升级到 {} 级!", self.名字, self.等级);
    }
        // 关联函数:构造函数
    fn 新建(名字: &str) -> Self {
        玩家 {
            名字: 名字.to_string(),
            等级: 1,
        }
    }
}

fn main() {
    let mut 战士 = 玩家::新建("李四");
    战士.升级();
    战士.升级();
    println!("当前状态: {:#?}", 战士); // 美化调试输出
}

输出:

李四 升级到 2 级!
李四 升级到 3 级!
当前状态: 玩家 {
    名字: "李四",
    等级: 3,
}

三、带参数的方法

方法可以接收额外参数实现更复杂逻辑。

示例3:战斗伤害计算

#[derive(Debug)] // 启用Debug trait
struct 玩家 {
    名字: String,
    等级: u32,
}
impl 玩家 {
    fn 升级(&mut self) {
        self.等级 += 1;
        println!("{} 升级到 {} 级!", self.名字, self.等级);
    }
        // 关联函数:构造函数
    fn 新建(名字: &str) -> Self {
        玩家 {
            名字: 名字.to_string(),
            等级: 1,
        }
    }
}

#[derive(Debug)]
struct 战斗单位 {
    名称: String,
    生命值: i32,
    攻击力: i32,
}

impl 战斗单位 {
    fn 攻击(&self, 目标: &mut 战斗单位) {
        let 伤害 = self.攻击力;
        目标.生命值 -= 伤害;
        println!(
            "【{}】对【{}】造成 {} 点伤害",
            self.名称, 目标.名称, 伤害
        );
    }
}

fn main() {
    let mut 怪兽 = 战斗单位 {
        名称: "火焰蜥蜴".to_string(),
        生命值: 50,
        攻击力: 8,
    };

    let 英雄 = 战斗单位 {
        名称: "光明骑士".to_string(),
        生命值: 100,
        攻击力: 15,
    };

    英雄.攻击(&mut 怪兽);
    println!("怪兽状态: {:?}", 怪兽);
}

输出:

【光明骑士】对【火焰蜥蜴】造成 15 点伤害
怪兽状态: 战斗单位 { 名称: "火焰蜥蜴", 生命值: 35, 攻击力: 8 }

四、链式方法调用

通过返回Self实现链式调用。

示例4:流畅接口设计

#[derive(Debug)]
struct 坐标 {
    x: i32,
    y: i32,
}

impl 坐标 {
    fn 新建(x: i32, y: i32) -> Self {
        坐标 { x, y }
    }

    fn 移动_x轴(mut self, 距离: i32) -> Self {
        self.x += 距离;
        self
    }

    fn 移动_y轴(mut self, 距离: i32) -> Self {
        self.y += 距离;
        self
    }
}

fn main() {
    let 最终位置 = 坐标::新建(0, 0)
        .移动_x轴(5)
        .移动_y轴(3)
        .移动_x轴(-2);

    println!("最终坐标: {:?}", 最终位置);
}

输出:

最终坐标: 坐标 { x: 3, y: 3 }

五、多个impl块

Rust允许为同一结构体定义多个impl块。

示例5:分块实现功能

#[derive(Debug)]
struct 温度计 {
    温度: f32,
}

// 基础功能
impl 温度计 {
    fn 当前温度(&self) -> f32 {
        self.温度
    }
}

// 扩展功能
impl 温度计 {
    fn 设置温度(&mut self, 新温度: f32) {
        self.温度 = 新温度;
        println!("温度已更新");
    }
}

fn main() {
    let mut 测温仪 = 温度计 { 温度: 25.0 };
    println!("初始温度: {:.1}℃", 测温仪.当前温度());
    测温仪.设置温度(28.5);
    println!("调试信息: {:#?}", 测温仪);
}

输出:

初始温度: 25.0℃
温度已更新
调试信息: 温度计 {
    温度: 28.5,
}

综合示例:完整角色系统

#[derive(Debug)]
struct 游戏角色 {
    名称: String,
    职业: String,
    生命值: u32,
    魔法值: u32,
    经验值: u32,
}

impl 游戏角色 {
    // 关联函数:创建新角色
    fn 创建(名字: &str, 职业: &str) -> Self {
        游戏角色 {
            名称: 名字.to_string(),
            职业: 职业.to_string(),
            生命值: 100,
            魔法值: 50,
            经验值: 0,
        }
    }

    // 实例方法:显示状态
    fn 状态报告(&self) {
        println!(
            "【{}】 {} 生命值:{} 魔法值:{} 经验值:{}",
            self.职业, self.名称, self.生命值, self.魔法值, self.经验值
        );
    }

    // 可变方法:获得经验
    fn 获得经验(&mut self, 经验: u32) {
        self.经验值 += 经验;
        println!("{} 获得了 {} 点经验", self.名称, 经验);
    }

    // 链式方法:治疗角色
    fn 治疗(mut self, 治疗量: u32) -> Self {
        self.生命值 += 治疗量;
        println!("治疗完成,当前生命值:{}", self.生命值);
        self
    }
}

fn main() {
    // 创建角色
    let mut 角色 = 游戏角色::创建("王五", "法师");
    
    // 初始状态
    println!("=== 初始状态 ===");
    角色.状态报告();
    println!("调试信息:{:?}\n", 角色);

    // 获得经验
    角色.获得经验(150);
    
    // 治疗并链式调用
    let 角色 = 角色.治疗(30);
    
    // 最终状态
    println!("\n=== 最终状态 ===");
    角色.状态报告();
    println!("美化调试信息:\n{:#?}", 角色);
}

输出:

=== 初始状态 ===
【法师】 王五 生命值:100 魔法值:50 经验值:0
调试信息:游戏角色 { 名称: "王五", 职业: "法师", 生命值: 100, 魔法值: 50, 经验值: 0 }

王五 获得了 150 点经验
治疗完成,当前生命值:130

=== 最终状态 ===
【法师】 王五 生命值:130 魔法值:50 经验值:150
美化调试信息:
游戏角色 {
    名称: "王五",
    职业: "法师",
    生命值: 130,
    魔法值: 50,
    经验值: 150,
}

总结要点

  1. 方法分类

    • 关联函数:fn 新建() -> Self(类似构造函数)
    • 实例方法:fn 方法(&self)(只读访问)
    • 可变方法:fn 方法(&mut self)(修改实例)
  2. 调试利器
    通过#[derive(Debug)]自动实现Debug trait,使用{:?}快速打印结构体内容

  3. 设计模式

    • 链式调用:返回Self实现流畅接口
    • 分块实现:多个impl块提高代码可读性
  4. 安全保证

    • 编译器自动检查可变性
    • 所有权系统防止悬垂引用

掌握方法语法,让Rust结构体真正成为既有数据又有行为的完整对象!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术:JavaScript、VUE.js(2.X)、css3 开发工具:pycharm、Visual Studio Code、HbuildX 数据库:MySQL 5.7.26&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

IMX6ULL环境搭建遇到的问题和解答更新

IMX6ULL环境搭建遇到的问题 开发板:正点原子IMX6ULL 终端软件串口控制:MobaXterm 1、网络环境搭建三方互ping不通 电脑无网口,使用绿联USB转网口,接网线直连开发板,电脑WiFi上网 按文档设置的 IP 地址,以…

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中,了解并安装成功了Docker,本章讲述如何使用Docker拉取镜像。 使用Docker,主要是想要创建并运行Docker容器,而容器又要根据Docker镜像来创建,那么首当其冲,必须要先有一个…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART(Universal Asynchronous Recei…

外置互感器导轨式电能表

1 概述 1 Overview ADL系列导轨式多功能电能表,是主要针对于光伏并网系统、微逆系统、储能系统、交流耦合系统等新能源发电系统而设计的一款智能仪表,产品具有精度高、体积小、响应速度快、安装方便等优点。具有对电力参数进行采样计量和监测&#xff…

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台,以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去,NoSQL 数据库提供云专用解决方案,而没有通用的互操作性标准。这导致对可互操作、可移植…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步:组态1214CPU,勾选时钟存储器 第二步:防护与安全里面连接机制勾选允许PUT/GET访问 第三步:添加PLC 第四步:点击网络试图,选中网口,把两个PLC连接起…

【漫画机器学习】083.安斯库姆四重奏(Anscombe‘s quartet)

安斯库姆四重奏(Anscombes Quartet) 1. 什么是安斯库姆四重奏? 安斯库姆四重奏(Anscombes Quartet)是一组由统计学家弗朗西斯安斯库姆(Francis Anscombe) 在 1973 年 提出的 四组数据集。它们…

【C语言】指针运算与数组关系:详细分析与实例讲解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯1. 指针的基础运算1.1 指针的加减运算1.2 指针加整数与指针减整数1.3 指针与指针的运算 💯2. 指针的实际应用:模拟 strlen 函数2.1 使用指针模拟…

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一,以其高精度与高效性深受业界青睐,广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布,开创了将目…

面向对象程序设计-实验1

6-1 求两个或三个整数中的最大数&#xff0c;用带默认参数的函数实现 本题要求实现一个带默认参数的函数&#xff0c;求两个或三个整数中的最大数 代码清单&#xff1a; #include <iostream> using namespace std; int main() { int max( int a,int b,int c0); int …

如何打开vscode系统用户全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用户配置文件&#xff0c;它存储了 编辑器的个性化设置&#xff0c;包括界面布局、代码格式化、扩展插件、快捷键等&#xff0c;是用户全局配置&#xff08;影响所有…

2025简约的打赏系统PHP网站源码

源码介绍 2025简约的打赏系统PHP网站源码 源码上传服务器&#xff0c;访问域名/install.php安装 支持自定义金额打赏 集成支付宝当面付 后台管理系统 订单记录查询 效果预览 源码获取 2025简约的打赏系统PHP网站源码

自指学习:AGI的元认知突破

文章目录 引言:从模式识别到认知革命一、自指学习的理论框架1.1 自指系统的数学定义1.2 认知架构的三重反射1.3 与传统元学习的本质区别二、元认知突破的技术路径2.1 自指神经网络架构2.2 认知效能评价体系2.3 知识表示的革命三、实现突破的关键挑战3.1 认知闭环的稳定性3.2 计…

Ubutun本地部署DeepSeek R1

目录 一、本地部署&终端命令行交互 二、网页端交互 三、参考链接 一、本地部署&终端命令行交互 Ollama 是一个轻量级的大语言模型管理工具&#xff0c;支持 Windows / Mac / Linux。 Ollama官网&#xff1a;Ollama # 下载安装ollama curl -fsSL https://ollama.co…

【Linux】Linux经典面试题

文章目录 1. Linux文件系统1.1 什么是inode&#xff1f;1.2 硬链接和软链接的区别1.3 文件权限和所有权 2. Linux进程管理2.1 进程和线程的区别2.2 进程间通信&#xff08;IPC&#xff09;2.3 守护进程&#xff08;Daemon&#xff09; 3. Linux内存管理3.1 虚拟内存和物理内存3…

MySQL 缓存机制与架构解析

目录 一、MySQL缓存机制概述 二、MySQL整体架构 三、SQL查询执行全流程 四、MySQL 8.0为何移除查询缓存&#xff1f; 五、MySQL 8.0前的查询缓存配置 六、替代方案&#xff1a;应用层缓存与优化建议 总结 一、MySQL缓存机制概述 MySQL的缓存机制旨在提升数据访问效率&am…

递归练习八(记忆化搜索)

一、解题心得 记忆化搜索就是带着备忘录递归搜索。 函数体设计&#xff1a;进 dfs 后先看看要找的值是不是在备忘录里面存着&#xff0c;有就直接返回&#xff0c;没有再考虑递归出口和中间函数逻辑。 记忆化搜索和递归暴搜都没有很大的关系&#xff0c;而是和动态规划问题有…