新闻详情

新闻详情

首页 / 资讯中心 / 详情

【Rust入门知识点学与练】第12课:结构体 Struct

发布时间:2026/9/11 18:15:32来源:尧图网络
【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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

PyTorch torch.signal.windows 窗函数完全指南:从 Bartlett 到 Kaiser 的频谱分析工具详解 2026/9/11 19:03:40

PyTorch torch.signal.windows 窗函数完全指南:从 Bartlett 到 Kaiser 的频谱分析工具详解

PyTorch torch.signal.windows 窗函数完全指南:从 Bartlett 到 Kaiser 的频谱分析工具详解 【免费下载链接】pytorch Tensors and Dynamic neural networks in Python with strong GPU acceleration 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch …

阅读更多 →
Revit二次开发实战:用DWGExportOptions与IExternalApplication实现一键批量导出DWG 2026/9/11 19:03:40

Revit二次开发实战:用DWGExportOptions与IExternalApplication实现一键批量导出DWG

简介:面向Revit二次开发工程师的示例工程,围绕DWGExportOptions类演示了在外部应用中自定义DWG导出参数、并批量出图的完整流程。资源将C#源码、界面资源和Addin配置文件整合为一套可加载的外部应用,适合需要掌握Revit API、处理模型导出任务…

阅读更多 →
大一电赛实战指南:从电路图到稳定运行的工程落地 2026/9/11 19:03:40

大一电赛实战指南:从电路图到稳定运行的工程落地

1. 这不是“打比赛”,是大一学生第一次把课本电路图焊在板子上的实感“大一打电赛心得”——这六个字背后,藏着一群刚结束高数期末、连示波器触发旋钮往哪调都得翻说明书的新生,在暑假里熬掉三包咖啡、烧糊两块PCB、被队友指着万用表骂“你测…

阅读更多 →
C++与Node.js集成:高性能计算与高并发I/O的完美结合 2026/9/11 19:03:40

C++与Node.js集成:高性能计算与高并发I/O的完美结合

1. 为什么需要C与Node.js集成?在当今的软件开发领域,C和Node.js各自占据着不可替代的位置。C以其高性能和系统级访问能力著称,而Node.js则凭借其事件驱动、非阻塞I/O模型成为构建高效网络应用的利器。将两者集成可以发挥各自的优势&#xff1…

阅读更多 →
素数判断算法优化:从暴力法到埃氏筛的实战解析 2026/9/11 19:03:40

素数判断算法优化:从暴力法到埃氏筛的实战解析

1. 题目背景与核心需求 这道来自厦门大学的机试题"非素数个数"看似简单,却暗藏玄机。作为计算机专业学生必须掌握的经典题型,它考察的是对素数判断算法的理解与优化能力。题目要求:给定一个整数n,统计小于n的所有非素数…

阅读更多 →
9Router 本地部署完全指南:安装、启动、配置与故障排查 2026/9/11 19:00:40

9Router 本地部署完全指南:安装、启动、配置与故障排查

9Router 本地部署完全指南:安装、启动、配置与故障排查 【免费下载链接】9router Unlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40 providers. Auto-fallback, RTK -40% tokens, nev…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞