学习笔记二十——Rust trait

news2025/4/21 18:49:21

🧩 Rust Trait 彻底搞懂版

👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。
🛠 方法

  1. 先给“心里模型”——用生活类比把抽象概念掰开揉碎。
  2. 再给“最小代码”——跑得动、改得动,看编译器怎么说。
  3. 最后给“练习路线”——照着做,概念才能沉到肌肉里。

1️⃣ Trait 的心里模型——“技能证书”

现实类比Rust 中的名字说明
驾驶证:上面写可开货车/小客车Trait“会干什么”的清单,只列方法签名;没有数据
司机甲类型 (struct / enum)真正扛活儿的人
给司机颁证impl Trait for Type表示 “甲已掌握驾驶技能”

三点记住:

  1. Trait 不存数据,只规定行为。
  2. 一个类型可以拿多本证书 → 组合能力。
  3. 证书颁发 (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 = 标准库 crate
  • serde, 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 的三步练法

  1. 抄 & 跑
    • 复制本文示例,边改边看编译器错误,尤其试着删掉 Trait Bound。
  2. 写小工具
    • 写个 Printable Trait,自定义三种类型实现;用 impl Trait 返回打印器。
  3. 读官方文档 &源码
    • IteratorRead 这些经典 Trait 的代码,再画出“证书 → 司机”关系图。

🔚 复盘一句话

Trait = 行为证书;Trait Bound = 入场门票;孤岛法则 = 证书只能在自己岛签发,双外来禁止
把这三件事连起来,就能在写泛型、并发、异步时游刃有余。祝练武顺利!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频小白系统入门课-2

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 课程传送门&#xff1a;音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库&#xff1a;传送门 音视频编解…

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、结语 一、简介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于 Linux 的发行版之一&#xff0c;旨在提供一个免费的、企业级的计算平台&#xff0c;因其稳定性、安全…

MATLAB 控制系统设计与仿真 - 34

多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先&#xff0c;对于如下系统&#xff1a; 当G(s)为单输入&#xff0c;单输出系统时&#xff1a; 如果&#xff1a; 则&#xff1a; 所以 因此&#xff0c;对于SISO&#xff0c;系统的增…

【网络】通过Samba实现Window挂在Linux服务器路径

有时候我们去进行内网部署时&#xff0c;会遇到客户或者甲方爸爸说&#xff0c;需要将Linux中的某个路径共享出去到Window上&#xff0c;挂载出比如Z:\这种盘符。通过打开Z盘&#xff0c;来查看服务器的指定目录下的数据。 步骤1&#xff1a; 在Linux中安装samba yum install…

架构思维:缓存层场景实战_读缓存(下)

文章目录 Pre业务场景缓存存储数据的时机与常见问题解决方案1. 缓存读取与存储逻辑2. 高并发下的缓存问题及解决方案3. 缓存预热&#xff08;减少冷启动问题&#xff09; 缓存更新策略&#xff08;双写问题&#xff09;1. 先更新缓存&#xff0c;再更新数据库&#xff08;不推荐…

uniapp微信小程序实现sse

微信小程序实现sse 注&#xff1a;因为微信小程序不支持sse请求&#xff0c;因为后台给的是分包的流&#xff0c;所以我们就使用接受流的方式&#xff0c;一直接受&#xff0c;然后把接受的数据拿取使用。这里还是使用uniapp的原生请求。 上代码 //注意&#xff1a;一定要下…

新能源汽车能量流测试的传感器融合技术应用指南

第一部分&#xff1a;核心原理模块化拆解 模块1&#xff1a;多源传感器物理层融合 关键技术&#xff1a; 高精度同步采集架构 采用PXIe-8840控制器同步定时模块&#xff08;NI PXIe-6674T&#xff09;&#xff0c;实现CAN/LIN/模拟量信号的μs级同步光纤电压传感器&#xff0…

人工智能与网络安全:AI如何预防、检测和应对网络攻击?

引言&#xff1a;网络安全新战场&#xff0c;AI成关键角色 在数字化浪潮不断推进的今天&#xff0c;网络安全问题已经成为每一家企业、每一个组织无法回避的“隐形战场”。无论是电商平台、金融机构&#xff0c;还是政府机关、制造企业&#xff0c;都可能面临数据泄露、勒索病毒…

链表知识回顾

类型&#xff1a;单链表&#xff0c;双链表、循环链表 存储&#xff1a;在内存中不是连续存储 删除操作&#xff1a;即让c的指针指向e即可&#xff0c;无需释放d&#xff0c;因为java中又内存回收机制 添加节点&#xff1a; 链表的构造函数 public class ListNode {// 结点…

FPGA学习(五)——DDS信号发生器设计

FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置&#xff08;1&#xff09;直接编辑法&#xff08;2&#xff09;用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…

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 在之前的基准测试中的出色表现感到惊讶&#xff0c;因此我决定将它与 Go …

定制化 Docsify 文档框架实战分享

&#x1f31f; 定制化 Docsify 文档框架实战分享 在构建前端文档平台时&#xff0c;我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify&#xff0c;我实现了以下几个方面的定制优化&#xff0c;分享给大家 &#x1f64c;。 &…

鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法

本文聚焦于ArkUI的布局实战&#xff0c;三种十分重要的布局&#xff0c;线性布局、弹性布局、层叠布局&#xff0c;在实际开发过程中这几种布局方法都十分常见&#xff0c;下面直接上手 线性布局 垂直布局&#xff08;Column&#xff09; 官方文档&#xff1a; Column-行列…

测试基础笔记第七天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…

[Windows] Adobe Camera Raw 17.2 win/Mac版本

[Windows] Adobe Camera Raw 链接&#xff1a;https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw&#xff0c;支持Photoshop&#xff0c;lightroom等Adobe系列软件&#xff0c;对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…

开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Gradio(一)

一、前言 在当今信息呈现方式越来越多样化的背景下&#xff0c;如何将文字、图片甚至视频高效转化为可听的音频体验&#xff0c;已经成为内容创作者、教育者和研究者们共同关注的重要话题。Podcastfy是一款基于Python的开源工具&#xff0c;它专注于将多种形式的内容智能转换成…

Python 深度学习实战 第11章 自然语言处理(NLP)实例

Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理&#xff08;NLP&#xff09;的深度学习应用&#xff0c;涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务&#xff0c;详细介绍了如何使…

将 DeepSeek 集成到 Spring Boot 项目实现通过 AI 对话方式操作后台数据

文章目录 项目简介本项目分两大模块 GiteeMCP 简介环境要求项目代码核心实现代码MCP 服务端MCP 客户端 DeepSeek APIDockersse 连接ws 连接&#xff08;推荐&#xff09;http 连接 vue2-chat-windowCherry Studio配置模型配置 MCP调用 MCP 项目简介 在本项目中&#xff0c;我们…

《前端面试题之 Vue 篇(第三集)》

目录 1、 nvm的常用命令①.Node.js 版本与 npm 版本的对应关系②Vue2 与 Vue3 项目的 Node.js 版本分界线③版本管理实践建议 2、Vue2 项目搭建&#xff08;基于 vue-cli Webpack&#xff09;① 环境准备② 安装 Vue CLI&#xff08;脚手架&#xff09;③.创建项目&#xff08…