学习笔记二十——Rust trait
🧩 Rust Trait 彻底搞懂版
👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。
🛠 方法:
- 先给“心里模型”——用生活类比把抽象概念掰开揉碎。
- 再给“最小代码”——跑得动、改得动,看编译器怎么说。
- 最后给“练习路线”——照着做,概念才能沉到肌肉里。
1️⃣ Trait 的心里模型——“技能证书”
| 现实类比 | Rust 中的名字 | 说明 |
|---|---|---|
| 驾驶证:上面写可开货车/小客车 | Trait | “会干什么”的清单,只列方法签名;没有数据 |
| 司机甲 | 类型 (struct / enum) | 真正扛活儿的人 |
| 给司机颁证 | impl Trait for Type | 表示 “甲已掌握驾驶技能” |
三点记住:
- Trait 不存数据,只规定行为。
- 一个类型可以拿多本证书 → 组合能力。
- 证书颁发 (
impl) 时才写具体实现,编译期 就定好函数体,零额外开销。
2️⃣ 最小可跑例子
trait SayHi { // 证书:会打招呼fn hi(&self); // 方法清单:打招呼
}struct Cat { name: String } // 司机:猫impl SayHi for Cat { // 颁证:猫会打招呼fn hi(&self) { // 具体实现println!("喵,我是 {}", self.name);}
}fn main() {let kitty = Cat { name: "Tom".into() };kitty.hi(); // 输出:喵,我是 Tom
}
3️⃣ Trait Bound 心里模型——“入场门票”
fn greet<T: SayHi>(v: &T) { v.hi(); }
- 意思:
T只有拿到 SayHi 证书 才能进场。 - 写法扩展:
T: SayHi + Clone→ 同时要两本证书;where子句只是把字写到下一行更清爽。
4️⃣ PartialOrd + Copy 为何要一起写?
| 证书 | 能力 | largest 为啥要它 |
|---|---|---|
PartialOrd | 能比较大小 (>, <) | 得知道谁更大 |
Copy | 能按位复制,不搬所有权 | 返回最大值时不挪走原数据 |
组合写法 T: PartialOrd + Copy 就像门口贴“身高 1.6m 以上 且 年满 18 岁才能进”。
5️⃣ largest 函数剖面图(完全自定义名字)
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {let mut max = list[0]; // Copy 允许拷贝for &item in list {if item > max { max = item; } // PartialOrd 允许比较}max
}
➜ 练习:把 Copy 去掉再编译,看看错误提示,体会“证书缺了一本”的感觉。
6️⃣ impl Trait vs dyn Trait:两种“请师傅干活”的方式
| 问题 | impl Trait(静态,一对一) | dyn Trait(动态,一群人) |
|---|---|---|
| 具体类型编译期确定吗? | ✅ 是 | ❌ 否(需到运行期) |
| 性能 | 零额外开销 | 每次方法调用需 vtable 查表 + 跳转 |
| 能否放不同类型一起? | 不能 | 可以放进 Vec<Box<dyn Trait>> |
7️⃣ Marker Trait——没有函数体的“隐形证书”
| 证书 | 表示能力 | 典型场景 |
|---|---|---|
Copy | 按位复制 | 标量、小 struct |
Send | 可以安全转到别的线程 | thread::spawn 移动所有权 |
Sync | 多线程可安全共享 &T | 只读全局配置 |
Unpin | 指针可被移动(异步 Pin 相关) | 自写 Future |
// 手动给自定义队列证明线程安全
struct MyQueue<T>(std::sync::Mutex<Vec<T>>);
unsafe impl<T: Send> Send for MyQueue<T> {}
unsafe impl<T: Send> Sync for MyQueue<T> {}
8️⃣ 孤岛法则 (Orphan Rule) ——“证书只能本岛签发”
先弄明白关键名词
crate:Rust 的 “岛” —— 一个编译单元 / 包。
- 你当前写代码的包 = 当前 crate
std= 标准库 crateserde,tokio等 = 外部 crate
8.1 四类组合(官方规则,按“岛”归属划分)
| 组合 | Type 属于 | Trait 属于 | 能 impl 吗? | 口诀 |
|---|---|---|---|---|
| ① 当前 crate + 当前 crate | 本岛 | 本岛 | ✅ | 自己人给自己发证,随便 |
| ② 外部 crate + 当前 crate | 外岛 | 本岛 | ✅ | 自家证书给外来人发 |
| ③ 当前 crate + 外部 crate | 本岛 | 外岛 | ✅ | 外岛证书发给自家人 |
| ④ 外部 crate + 外部 crate | 外岛 | 外岛 | ❌ | “双外来”禁止——怕撞车 |
你的说法 “当前 crate / Std / 外部 crate” 可以映射到表中:
- 标准库 算 外部 crate(你改不了源)。
- 只要落到 组合④(Type + Trait 都不归你),就违规。
8.2 违反怎么办?——Newtype Pattern
// 想给外部库 FooType 实现外部库 BarTrait,不允许
struct MyFoo(FooType); // 包一层,本岛 Type
impl BarTrait for MyFoo { … } // 现在是组合③,合法
9️⃣ 彻底掌握 Trait 的三步练法
- 抄 & 跑
- 复制本文示例,边改边看编译器错误,尤其试着删掉 Trait Bound。
- 写小工具
- 写个
PrintableTrait,自定义三种类型实现;用impl Trait返回打印器。
- 写个
- 读官方文档 &源码
- 看
Iterator、Read这些经典 Trait 的代码,再画出“证书 → 司机”关系图。
- 看
🔚 复盘一句话
Trait = 行为证书;Trait Bound = 入场门票;孤岛法则 = 证书只能在自己岛签发,双外来禁止。
把这三件事连起来,就能在写泛型、并发、异步时游刃有余。祝练武顺利!
相关文章:
学习笔记二十——Rust trait
🧩 Rust Trait 彻底搞懂版 👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 🛠 方法: 先给“心里模型”——用生活类比把抽象概念掰开揉…...
音视频小白系统入门课-2
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库:传送门 音视频编解…...
Linux:安装 CentOS 7(完整教程)
文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、结语 一、简介 CentOS(Community ENTerprise Operating System)是一个基于 Linux 的发行版之一,旨在提供一个免费的、企业级的计算平台,因其稳定性、安全…...
MATLAB 控制系统设计与仿真 - 34
多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增…...
【网络】通过Samba实现Window挂在Linux服务器路径
有时候我们去进行内网部署时,会遇到客户或者甲方爸爸说,需要将Linux中的某个路径共享出去到Window上,挂载出比如Z:\这种盘符。通过打开Z盘,来查看服务器的指定目录下的数据。 步骤1: 在Linux中安装samba yum install…...
DevOps 进阶指南:如何让工作流更丝滑?
DevOps 进阶指南:如何让工作流更丝滑? 引言 在 DevOps 世界里,我们追求的是高效、稳定、自动化。但现实总是充满挑战:代码部署失败、CI/CD 过程卡顿、环境不一致……这些痛点让开发和运维团队疲惫不堪。今天,我就来聊聊如何优化 DevOps 工作流,通过实战案例和代码示例,…...
架构思维:缓存层场景实战_读缓存(下)
文章目录 Pre业务场景缓存存储数据的时机与常见问题解决方案1. 缓存读取与存储逻辑2. 高并发下的缓存问题及解决方案3. 缓存预热(减少冷启动问题) 缓存更新策略(双写问题)1. 先更新缓存,再更新数据库(不推荐…...
uniapp微信小程序实现sse
微信小程序实现sse 注:因为微信小程序不支持sse请求,因为后台给的是分包的流,所以我们就使用接受流的方式,一直接受,然后把接受的数据拿取使用。这里还是使用uniapp的原生请求。 上代码 //注意:一定要下…...
C#语言的区块链
C#语言在区块链开发中的应用 引言 区块链技术自比特币问世以来,逐渐发展成为一种革命性的技术,其在金融、供应链、物联网等各个领域都产生了深远的影响。随着区块链应用的不断增加,开发者对区块链技术的需求也在不断上升。在众多编程语言中…...
Ubuntu服务器日志满audit:backlog limit exceeded了会报错解决方案-Linux 审计系统 (auditd) 工具
auditd 是 Linux 系统中的审计守护进程,负责收集、记录和监控系统安全相关事件。以下是相关工具及其功能: 核心组件 auditd - 审计守护进程 系统的审计服务主程序 收集系统调用信息并写入日志文件 通常存储在 /var/log/audit/audit.log auditctl - 审计控…...
新能源汽车能量流测试的传感器融合技术应用指南
第一部分:核心原理模块化拆解 模块1:多源传感器物理层融合 关键技术: 高精度同步采集架构 采用PXIe-8840控制器同步定时模块(NI PXIe-6674T),实现CAN/LIN/模拟量信号的μs级同步光纤电压传感器࿰…...
人工智能与网络安全:AI如何预防、检测和应对网络攻击?
引言:网络安全新战场,AI成关键角色 在数字化浪潮不断推进的今天,网络安全问题已经成为每一家企业、每一个组织无法回避的“隐形战场”。无论是电商平台、金融机构,还是政府机关、制造企业,都可能面临数据泄露、勒索病毒…...
链表知识回顾
类型:单链表,双链表、循环链表 存储:在内存中不是连续存储 删除操作:即让c的指针指向e即可,无需释放d,因为java中又内存回收机制 添加节点: 链表的构造函数 public class ListNode {// 结点…...
FPGA学习(五)——DDS信号发生器设计
FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置(1)直接编辑法(2)用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…...
【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值
文章目录 前言一、题目二、解题思路总结 前言 本次训练内容: 栈的复习。栈模拟四则运算计算问题的练习。训练解题思维。 一、题目 从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加()、减…...
OpenCv高阶(六)——图像的透视变换
目录 一、透视变换的定义与作用 二、透视变换的过程 三、OpenCV 中的透视变换函数 1. cv2.getPerspectiveTransform(src, dst) 2. cv2.warpPerspective(src, H, dsize, dstNone, flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue0) 四、文档扫描校正&a…...
性能比拼: Go vs Bun
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 我对 Bun 在之前的基准测试中的出色表现感到惊讶,因此我决定将它与 Go …...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
Qt中读写结构体字节数据
在Qt中读写结构体字节数据通常涉及将结构体转换为字节数组(QByteArray)或直接从内存中读写。以下是几种常见方法: 方法1:使用QDataStream读写结构体 cpp #include <QFile> #include <QDataStream>// 定义结构体 #pragma pack(push, 1) //…...
鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
本文聚焦于ArkUI的布局实战,三种十分重要的布局,线性布局、弹性布局、层叠布局,在实际开发过程中这几种布局方法都十分常见,下面直接上手 线性布局 垂直布局(Column) 官方文档: Column-行列…...
测试基础笔记第七天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…...
[Windows] Adobe Camera Raw 17.2 win/Mac版本
[Windows] Adobe Camera Raw 链接:https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw,支持Photoshop,lightroom等Adobe系列软件,对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…...
开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Gradio(一)
一、前言 在当今信息呈现方式越来越多样化的背景下,如何将文字、图片甚至视频高效转化为可听的音频体验,已经成为内容创作者、教育者和研究者们共同关注的重要话题。Podcastfy是一款基于Python的开源工具,它专注于将多种形式的内容智能转换成…...
深入剖析 Java Web 项目序列化:方案选型与最佳实践
在 Java Web 开发中,“序列化”是一个你无法绕过的概念。无论是缓存数据、共享 Session,还是进行远程过程调用(RPC)或消息传递,序列化都扮演着底层数据搬运工的角色。它负责将内存中的 Java 对象转换成可传输或可存储的…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…...
将 DeepSeek 集成到 Spring Boot 项目实现通过 AI 对话方式操作后台数据
文章目录 项目简介本项目分两大模块 GiteeMCP 简介环境要求项目代码核心实现代码MCP 服务端MCP 客户端 DeepSeek APIDockersse 连接ws 连接(推荐)http 连接 vue2-chat-windowCherry Studio配置模型配置 MCP调用 MCP 项目简介 在本项目中,我们…...
《前端面试题之 Vue 篇(第三集)》
目录 1、 nvm的常用命令①.Node.js 版本与 npm 版本的对应关系②Vue2 与 Vue3 项目的 Node.js 版本分界线③版本管理实践建议 2、Vue2 项目搭建(基于 vue-cli Webpack)① 环境准备② 安装 Vue CLI(脚手架)③.创建项目(…...
PHP实现图片自动添加水印效果
<?php // 设置原始图片路径和水印图片路径 $original_image original.jpg; $watermark_image watermark.png;// 创建图片资源 $original imagecreatefromjpeg($original_image); $watermark imagecreatefrompng($watermark_image);// 获取图片尺寸 $original_width im…...
嵌入式C语言位操作的几种常见用法
作为一名老单片机工程师,我承认,当年刚入行的时候,最怕的就是看那些密密麻麻的寄存器定义,以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器,硬件就是不听话”的情况,简直想把示波器砸了&am…...
