【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现

发布时间:2026/7/23 18:50:54

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现
10.3 trait Pt.1trait的定义、约束与实现10.3.1. 什么是traittrait 的意思是特征、特质。trait 用来向 Rust 编译器描述某个类型具有哪些能力以及它可以与其他类型共享哪些行为。trait 以抽象方式定义共享行为。还有 trait bounds约束的概念它可以把泛型类型参数约束为实现了特定行为的类型。换句话说就是要求泛型类型参数实现某些 trait。Rust 中的 trait 与其他语言中的接口interface有些类似但仍有区别。10.3.2. 定义一个trait类型的行为由该类型本身可以调用的方法组成。有时不同类型具有相同的方法这时我们就说这些类型共享相同的行为。trait 提供了一种把方法组合在一起的方式从而定义实现某种目的所必需的行为。- 使用trait关键字定义 trait。trait 中的方法既可以只写方法签名以;结尾、没有方法体也可以提供默认实现后文会讲到- 一个 trait 可以有多个方法每个需要实现方提供的方法签名单独占一行并以;结尾- 对于没有默认实现的方法实现该 trait 的类型必须提供具体的方法体例如pub trait Summary { fn summarize(self) - String; }在trait前面加上pub表示它是公共的。这个 trait 名为Summary其中包含一个名为summarize的方法签名。除了self之外没有其他参数返回类型是String签名以;结束。它没有方法体因此没有具体实现。当然一个trait下可以有很多方法签名pub trait Summary { fn summarize(self) - String; fn summarize1(self) - String; fn summarize2(self) - String; //...... }10.3.3. 在类型上实现trait为类型实现 trait 与为类型实现方法很类似但也有不同之处。为类型实现方法的写法是在impl关键字后面跟上类型impl Yyyy {....}为类型实现 trait 的写法则是impl Xxxx for Yyyy {....}Xxxx指的是 trait 名Yyyy指的是类型名在花括号内需要为 trait 中的方法签名写出具体实现例如lib.rspub trait Summary { fn summarize(self) - String; } pub struct NewsArticle { pub headline: String, pub location: String, pub author: String, pub content: String, } impl Summary for NewsArticle { fn summarize(self) - String { format!({}, by {} ({}), self.headline, self.author, self.location) } } pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool, } impl Summary for Tweet { fn summarize(self) - String { format!({}: {}, self.username, self.content) } }结构体NewsArticle表示新闻文章。它有四个字段headline表示标题location表示地点author表示作者content表示内容结构体Tweet表示 X前身为 Twitter上的推文。它有四个字段username、content、reply和retweet这两个结构体类型当然不同它们的大多数字段也不同。但它们都可以有相同的行为——提供摘要Summary因此分别在这两个类型上实现了Summary。impl Summary for NewsArticle { fn summarize(self) - String { format!({}, by {} ({}), self.headline, self.author, self.location) } }这段代码为NewsArticle实现了该 trait。因为 trait 定义中包含summarize方法签名所以这里必须写出具体实现使用format!宏把self.headline、self.author和self.location组合成一个字符串并返回。impl Summary for Tweet { fn summarize(self) - String { format!({}: {}, self.username, self.content) } }这段代码也为Tweet实现了该 trait同样提供了summarize的具体实现使用format!宏把self.username和self.content组合成一个字符串并返回。现在来到main.rs看看实例是如何调用的use RustStudy::{Summary, Tweet}; fn main() { let tweet Tweet { username: String::from(horse_ebooks), content: String::from( of course, as you probably already know, people, ), reply: false, retweet: false, }; println!(1 new tweet: {}, tweet.summarize()); }记住我们的代码写在lib.rs中在main.rs中使用之前需要先把它引入作用域。写法是use 你的package名::...::你需要的模块;你的 package 名就是Cargo.toml中的项目名把它复制过来即可。引入Summary是因为使用了Summarytrait 下的summarize方法引入Tweet是因为使用了Tweet结构体。看一下输出1 new tweet: horse_ebooks: of course, as you probably already know, people10.3.4. trait的约束想要为某个类型实现某个 trait前提条件是- 该类型本身例如Tweet或该 trait 本身例如让Vector实现本地的Summary必须在本地 crate 中定义- 不能为外部类型实现外部 trait。例如在本地 crate 中为标准库的Vector实现标准库的Displaytrait这个限制是语言一致性规则的一部分。更具体地说它是孤儿规则之所以这样命名是因为父类型并没有定义在当前 crate 中。这条规则确保其他人的代码不能随意破坏你的代码反之亦然。如果没有这条规则两个 crate 可以为同一个类型实现同一个 traitRust 就不知道该使用哪个实现。10.3.5. 默认实现有时为 trait 中的某些或全部方法提供默认行为非常有用。这让我们不必为每一个类型的实现都提供自定义行为。我们仍然可以为特定类型实现 trait 方法。当为某些类型实现 trait 时我们可以选择保留或覆盖每个方法的默认实现。之前的写法是pub trait Summary { fn summarize(self) - String; }之前的版本只写了方法签名没有提供实现但实际上可以添加默认实现默认实现pub trait Summary { fn summarize(self) - String { String::from((Read more...)) } }这里的默认实现只是返回字符串(Read more...)。因为这个方法在 trait 中已经有默认实现了所以具体类型可以直接使用该默认实现而不必自己再提供实现。以NewsArticle为例它原本有自己的实现也可以叫做对默认实现的覆盖impl Summary for NewsArticle { fn summarize(self) - String { format!({}, by {} ({}), self.headline, self.author, self.location) } }如果删掉这个具体实现NewsArticle就会使用默认实现impl Summary for NewsArticle {}还有一点需要知道带有默认实现的方法可以调用同一trait中的其他方法即使那些方法没有默认实现pub trait Summary { fn summarize_author(self) - String; fn summarize(self) - String { format!((Read more from {}...), self.summarize_author()) } }summarize的默认实现调用了summarize_author即使summarize_author只是一个签名、没有具体实现。但如果想为某个类型实现summarize就需要先实现summarize_authorimpl Summary for NewsArticle { fn summarize_author(self) - String { format!({}, self.author) } }PS由于NewsArticle使用了summarize的默认实现所以这里不需要再写summarize的实现。这种写法有一点需要注意无法从被覆盖的方法实现中调用默认实现。

相关新闻

【JavaScript】Javascript—APIs—Day01

【JavaScript】Javascript—APIs—Day01

2026/7/23 18:40:54

Javascript——Day0601. 声明变量const优先02. DOM树和DOM对象03. 获取DOM元素04. DOM修改元素内容以及年会抽奖案例05. DOM修改元素常见属性以及案例06. 通过style修改样式07. 通过类名修改样式08. 通过classList修改样式09. 随机轮播图案例10. 获取设置表单的值11. H5自定义属…

Unity强化学习实战项目—自动泊车「Unity+MLagent」—效果展示【源码在文末】

Unity强化学习实战项目—自动泊车「Unity+MLagent」—效果展示【源码在文末】

2026/7/23 18:40:54

Unity强化学习实战项目—自动泊车「UnityMLagent」—效果展示【源码在文末】 文章目录Unity强化学习实战项目—自动泊车「UnityMLagent」—效果展示【源码在文末】一、内容与步骤二、效果展示三、源码一、内容与步骤 1、搭建一个简单的停车场模型并实现小车运动,要…

安全强化学习:约束优化与工程实践指南

安全强化学习:约束优化与工程实践指南

2026/7/23 18:40:54

1. 安全强化学习的基本概念与挑战强化学习在模拟环境中取得了显著成就,但在现实世界应用中面临严峻的安全挑战。传统强化学习通过试错探索来优化策略,这种机制在物理环境中可能导致严重后果。想象一下自动驾驶汽车在真实道路上随机尝试各种动作——这显然…

Python计算机毕设之基于 Python 的期货行情展示与模拟交易系统 零基础期货实训虚拟交易平台设计(完整前后端代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的期货行情展示与模拟交易系统 零基础期货实训虚拟交易平台设计(完整前后端代码+说明文档+LW,调试定制等)

2026/7/23 19:40:56

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Python计算机毕设之基于 Python 的校园二手社交交易平台实现校园二手物品问答互动与交易系统设计 (完整前后端代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的校园二手社交交易平台实现校园二手物品问答互动与交易系统设计 (完整前后端代码+说明文档+LW,调试定制等)

2026/7/23 19:40:56

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

具身智能进入“干活时代“:从展台演示到真实部署,数据才是核心瓶颈

具身智能进入“干活时代“:从展台演示到真实部署,数据才是核心瓶颈

2026/7/23 19:40:56

具身智能进入"干活时代":从展台演示到真实部署,数据才是核心瓶颈2026年7月中旬,国内规模最大的人工智能展会在上海举办。展览总面积首次突破10万平方米,超过1100家企业参展,3000余件展品中有300多件为全球首…

GEE中的几个小技巧

GEE中的几个小技巧

2026/7/23 19:40:56

1.如何上传你要的区域:准备你所在区域的shp(有四个文件)主页点击1.Assets 2.Shape files 3.Select 把四个文件都传上去 4.命名你的区域Assets下有文件就是传成功了 然后切到Scripts就可以调用了// 定义研究区域 var region ee.FeatureCollection(projects/ee-jiuwa…

嵌入式系统参数动态更新利器:TI MCU POM模块原理与实战

嵌入式系统参数动态更新利器:TI MCU POM模块原理与实战

2026/7/23 19:40:56

1. 项目概述:为什么我们需要POM?在嵌入式系统开发,尤其是汽车电子、工业控制这类对实时性和可靠性要求极高的领域,我们经常面临一个经典难题:如何在产品部署后,甚至在系统运行时,动态地调整程序…

J4105 工控小主机刷写 Proxmox VE 及部署 OpenWrt 与 Home Assistant OS完整指南

J4105 工控小主机刷写 Proxmox VE 及部署 OpenWrt 与 Home Assistant OS完整指南

2026/7/23 19:30:56

J4105 工控小主机刷写 Proxmox VE 及部署 OpenWrt 与 Home Assistant OS完整指南 本文档详细介绍 J4105 工控小主机的刷机流程,核心分为准备工作、安装 Proxmox VE(PVE)、创建 OpenWrt 与 Home Assistant OS 虚拟机三大步骤,每一步均包含具体工具、操作细节及注意事项,确…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…