尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【Rust入门知识点学与练】第12课:结构体 Struct
知识点1定义和使用结构体结构体让你把相关的数据组合在一起// 定义结构体structStudent{name:String,age:u32,score:f64,}fnmain(){// 创建结构体实例lets1Student{name:String::from(小明),age:18,score:95.5,};// 访问字段println!(姓名: {},s1.name);println!(年龄: {},s1.age);println!(分数: {},s1.score);// 修改字段需要 mutletmuts2Student{name:String::from(小红),age:17,score:88.0,};s2.score92.0;println!(小红的新分数: {},s2.score);// 用已有实例创建新实例部分字段更新lets3Student{name:String::from(小刚),..s2// 其余字段从 s2 复制};println!(小刚的年龄: {},s3.age);// 17来自 s2// 元组结构体没有字段名structPoint(f64,f64);letpPoint(3.0,4.0);println!(x{}, y{},p.0,p.1);// 单元结构体没有任何字段structMarker;let_mMarker;}知识点2给结构体添加方法structRectangle{width:f64,height:f64,}// impl 块给结构体添加方法implRectangle{// 关联函数类似构造函数没有 self 参数fnnew(w:f64,h:f64)-Rectangle{Rectangle{width:w,height:h}}// 方法接收 self不可变借用fnarea(self)-f64{self.width*self.height}// 方法接收 mut self可变借用fnscale(mutself,factor:f64){self.width*factor;self.height*factor;}// 方法判断是否是正方形fnis_square(self)-bool{(self.width-self.height).abs()0.001}}fnmain(){// 用关联函数创建letmutrectRectangle::new(10.0,5.0);// 调用方法println!(面积: {},rect.area());// 50println!(是正方形? {},rect.is_square());// false// 调用可变方法rect.scale(2.0);println!(缩放后宽: {}, 高: {},rect.width,rect.height);// 20, 10}知识点3为结构体实现 traitusestd::fmt;structColor{r:u8,g:u8,b:u8,}// 实现 Display trait让结构体可以用 {} 打印implfmt::DisplayforColor{fnfmt(self,f:mutfmt::Formatter)-fmt::Result{write!(f,RGB({}, {}, {}),self.r,self.g,self.b)}}// 实现 Debug trait让结构体可以用 {:?} 打印implfmt::DebugforColor{fnfmt(self,f:mutfmt::Formatter)-fmt::Result{write!(f,Color {{ r: {}, g: {}, b: {} }},self.r,self.g,self.b)}}fnmain(){letredColor{r:255,g:0,b:0};println!({},red);// 调用 Displayprintln!({:?},red);// 调用 Debug}核心规则概念 写法定义结构体 struct Name { field: Type }创建实例 Name { field: value }访问字段 instance.field方法只读 fn method(self)方法可修改 fn method(mut self)关联函数 fn new(…) - Self无 self调用方法 instance.method()调用关联函数 Type::new()动手试试补全下面的代码// 补全定义一个 Book 结构体包含字段// title: String// author: String// pages: u32// price: f64// 补全为 Book 实现以下方法// 1. new(title, author, pages, price) - Book// 2. summary(self) - String返回格式《书名》 by 作者, 共X页, ¥价格// 3. is_expensive(self) - bool价格超过 50.0 返回 true// 4. discount(mut self, percent: f64)价格打折扣如传入 0.8 表示打八折fnmain(){// 补全创建两本书// book1: Rust编程, 张三, 300页, 68.0元// book2: 算法入门, 李四, 200页, 45.0元// 补全打印两本书的摘要// 期望输出:// 《Rust编程》 by 张三, 共300页, ¥68// 《算法入门》 by 李四, 共200页, ¥45// 补全检查每本书是否贵打印结果// 期望输出:// Rust编程 贵吗? true// 算法入门 贵吗? false// 补全给 book1 打七折打印新价格// 期望输出: Rust编程 折后价: 47.6}期望输出《Rust编程》 by 张三, 共300页, ¥68《算法入门》 by 李四, 共200页, ¥45Rust编程 贵吗? true算法入门 贵吗? falseRust编程 折后价: 47.6写好了贴过来没问题就进入第13课枚举 Enum 贴代码// 定义 Book 结构体#[derive(Debug)]structBook{title:String,author:String,pages:u32,price:f64,}// 为 Book 实现方法implBook{// 1. 构造器 newfnnew(title:String,author:String,pages:u32,price:f64)-Self{Book{title,author,pages,price,}}// 2. 摘要 summaryself 只读借用fnsummary(self)-String{format!(《{}》 by {}, 共{}页, ¥{},self.title,self.author,self.pages,self.price)}// 3. 判断是否昂贵fnis_expensive(self)-bool{self.price50.0}// 4. 打折方法mut self 需要修改实例fndiscount(mutself,percent:f64){self.price*percent;}}fnmain(){// 创建两本书letmutbook1Book::new(String::from(Rust编程),String::from(张三),300,68.0,);letbook2Book::new(String::from(算法入门),String::from(李四),200,45.0,);// 打印摘要println!({},book1.summary());println!({},book2.summary());// 判断是否昂贵println!(Rust编程 贵吗? {},book1.is_expensive());println!(算法入门 贵吗? {},book2.is_expensive());// book1 七折book1.discount(0.7);println!(Rust编程 折后价: {},book1.price);}运行输出plaintext《Rust编程》 by 张三, 共300页, ¥68《算法入门》 by 李四, 共200页, ¥45Rust编程 贵吗? true算法入门 贵吗? falseRust编程 折后价: 47.6结构体方法核心知识点struct自定义复合数据类型把多个字段打包在一起。impl 结构体名 {} 给结构体添加方法。Self 代表当前结构体类型Book 的别名构造函数里常用。self 只读方法不修改对象 mut self 可变方法可以修改结构体里面字段的值例如 discount。format! 生成格式化字符串和 println! 很像但它返回字符串而不是直接打印。实例需要 mut 才能调用可变方法 let mut book1 book2 不需要修改不需要 mut。对比 Pythonstruct ≈ Python 的 classimpl 里面的函数 ≈ 类的成员方法。结构体练习完成结构体、方法、借用这块就入门了继续下一课。
RELATED

相关推荐

HDFS副本机制:原理、配置与生产实践

HDFS副本机制:原理、配置与生产实践

1. HDFS副本机制的核心价值与设计哲学在分布式存储系统中,数据可靠性始终是首要考量。HDFS作为Hadoop生态的核心存储组件,其副本机制的设计直接决定了数据安全性和集群吞吐能力。我曾在PB级集群运维中亲历过因副本配置不当导致的数据丢失事故&#xff0c…

📅 2026/9/11 18:15:38
基于YOLOv8-pose的游泳动作识别实战:数据标注、训练与Gradio部署

基于YOLOv8-pose的游泳动作识别实战:数据标注、训练与Gradio部署

简介:面向计算机视觉方向学生与毕业设计开发者,这份资源提供一套基于YOLOv8的游泳动作识别系统,包含完整可运行的源码、配套数据集、可视化界面与部署说明,适合快速复现并用于毕设、课程设计或初期立项演示。资源共97个文件&#…

📅 2026/9/11 18:15:38
LangGraph智能体与长期记忆

LangGraph智能体与长期记忆

LangGraph 智能体与长期记忆:从无状态对话到有记忆的协作者摘要:本文基于 DeepLearning.AI《LangGraph 中的 AI 代理》与《基于 LangGraph 的长期代理记忆》两门课程实践,拆解 LangGraph 智能体的三大核心机制:StateGraph 状态流、…

📅 2026/9/11 18:15:38
MORE NEWS

更多资讯

📰

STM32F405ZG与AD5293数字电位器实现工业自动校准方案

做仪表、传感器变送器或者工业板卡的朋友,八成都有过半夜还在车间里拿螺丝刀拧电位器的经历。每个批次元器件都有离散性,每块板子都要单独校准,校准完还得担心机械电位器用久了氧化、振动导致阻值漂移。后来我把整个方案换成了数字电位器&…

📰

“先做事,出错再处理”(使用 `try-except`),区别于传统的 LBYL(Look Before You Leap,先检查再执行)

一、 核心语言与底层机制模式 1. 迭代器与生成器模式 (Iterator & Generator) 核心考点:实现 __iter__ 和 __next__ 协议;使用 yield 关键字实现惰性计算(按需生成数据)。应用场景:分页浏览大型数据集、流式传输百…

📰

9Router 智能路由实战指南:三级自动回退、配额追踪与低成本 AI 编码方案

9Router 智能路由实战指南:三级自动回退、配额追踪与低成本 AI 编码方案 【免费下载链接】9router Unlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40 providers. Auto-fallback, RTK …

📰

OpenProject 开源项目管理软件实战导读:免费自托管,甘特图与团队协作一次配齐

OpenProject 开源项目管理软件实战导读:免费自托管,甘特图与团队协作一次配齐 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alt…

📰

把团队配置锁进 umi 自定义模板:一条 umi create 生成新项目

把团队配置锁进 umi 自定义模板:一条 umi create 生成新项目 【免费下载链接】umi A framework in react community ✨ 项目地址: https://gitcode.com/GitHub_Trending/um/umi 上周又被要求"把老项目拷一份改改名"。第三次了,你还在手…

📰

Bilibook:Windows平台轻量级知识管理工具部署指南

1. Bilibook项目概述Bilibook是一个基于Windows平台的轻量级知识管理工具,专为中文用户设计。它采用本地化部署方案,无需复杂配置即可快速搭建个人知识库系统。作为一位长期使用各类笔记软件的资深用户,我发现Bilibook在以下场景特别实用&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬