【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的实现。这种写法有一点需要注意无法从被覆盖的方法实现中调用默认实现。

相关新闻

【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound

【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound

10.4 trait Pt.2:trait作为参数和返回类型、trait bound 10.4.1. 把trait作为参数 继续以 10.3 trait Pt.1:trait的定义、约束与实现 中的内容为例: pub trait Summary {fn summarize(&self) -> String; }pub struct NewsArticle {…

2026/7/23 18:51:03阅读更多 →
【Rust自学】10.5. 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期

【Rust自学】10.5. 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期

10.5 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期 10.5.1. 什么是生命周期 Rust 中的每个引用都有自己的生命周期。生命周期的作用是让引用保持有效;换句话说,它就是引用保持有效的作用域。 在大多数情况下&#xff0c…

2026/7/23 18:51:03阅读更多 →
【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程

【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程

7.5 use关键字 Pt.2 :重导出与换国内镜像源教程 7.5.1. 使用pub use重新导出名称 使用use将路径导入作用域内后,该名称在词法作用域内是私有的。 以 7.4. use关键字 Pt.1:use的使用与as关键字 的代码为例: mod front_of_house…

2026/7/23 18:49:03阅读更多 →
Python在自然科学中的AI应用:高维数据处理与可解释性分析

Python在自然科学中的AI应用:高维数据处理与可解释性分析

1. 项目概述:当Python遇上自然科学中的AI在实验室泡了十年,我深刻体会到自然科学研究者面对高维数据时的痛苦——那些基因序列、气象观测、天体物理信号,动辄成千上万个维度,Excel连打开都费劲。直到五年前我开始系统地将机器学习…

2026/7/23 20:01:27阅读更多 →
OpenAI 昨天卖「可信 Agent」,今天承认模型越狱——Presence 的信任赤字有多大?

OpenAI 昨天卖「可信 Agent」,今天承认模型越狱——Presence 的信任赤字有多大?

一个注定被放在一起读的故事7月22日,OpenAI 正式发布了 Presence。一个面向企业的 AI Agent 编排和管理平台,官方描述是「帮助企业在受控环境中部署可信的 AI Agent,能回答问题、解决问题、使用公司系统、采取经授权的行动,必要时…

2026/7/23 20:01:27阅读更多 →
主板后边为什么经常有两个以太网口?第二个网口的4种用法你绝对不知道

主板后边为什么经常有两个以太网口?第二个网口的4种用法你绝对不知道

主板后边为什么经常有两个以太网口(就是我们常说的网口),一个不够用吗?还能插USB转网卡啊!哈哈,我当初装机的时候也这么想过,结果后来发现,这个“多余”的第二个网口简直是宝藏!它不光是给服务器用的,普通人玩起来也能解锁一大波高级功能。 看,这就是典型的主板后置…

2026/7/23 20:01:27阅读更多 →
【CTF-WEB-代码审计】URL编码绕过路经检查访问flag页面,admin编码为%61%64min

【CTF-WEB-代码审计】URL编码绕过路经检查访问flag页面,admin编码为%61%64min

题目 BITSCTF 2026\题目\WEB\rusty-proxy rusty-proxy I just vibecoded a highly secure reverse proxy using rust, I hope it works properly. http://chals.bitskrieg.in:25001解题思路 访问网站 http://chals.bitskrieg.in:25001http://chals.bitskrieg.in:25001/api/stat…

2026/7/23 20:01:27阅读更多 →
TI HTU模块安全机制与双缓冲配置实战解析

TI HTU模块安全机制与双缓冲配置实战解析

1. HTU模块核心功能与设计哲学解析在嵌入式系统,尤其是汽车电子和工业控制这类对实时性与可靠性要求严苛的领域,微控制器(MCU)内部的数据搬运效率与安全性直接决定了整个系统的成败。德州仪器(TI)的高端定时…

2026/7/23 20:01:27阅读更多 →
【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

题目 攻防世界-WEB-PHP2 https://adworld.xctf.org.cn/challenges/list 解题 访问网址 http://61.147.171.105:64825/index.phps admin.split().map(c > % c.charCodeAt(0).toString(16).toUpperCase()).join()%61%64%6D%69%6E%61%64%6D%69%6E.split().map(c > % …

2026/7/23 19:59:27阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →