Rust Trait简介
admin
2024-02-27 06:39:00
0

Rust trait简介

内容总结自《The Rust Programing Language》

首先简单说一下泛型:这个基础和C++的模板大概类似,从语法编译层面提供一种接收任意类型的手段,需要知道的是泛型在编译时会进行单态化处理,所以泛型是不会增加运行时负担的。熟悉C++的前提下,泛型应该是看一下就可以很快入门,这里不赘述。

trait定义

Rust通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型,trait就类似其他语言的接口。trait 定义就是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。

贴一下相干性的概念:(感觉是常识)

不能为外部类型实现外部 trait。例如,不能在 aggregator crate 中为 Vec 实现 Display trait。这是因为 DisplayVec 都定义于标准库中,它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性coherence) 的程序属性的一部分,或者更具体的说是 孤儿规则orphan rule),其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码,反之亦然。

//trait定义的简单例子
pub trait Summary {fn summarize_author(&self) -> String;//trait方法支持默认实现fn summarize(&self) -> String {format!("(Read more from {}...)", self.summarize_author())}
}
pub struct Tweet {pub username: String,pub content: String,pub reply: bool,pub retweet: bool,
}impl Summary for Tweet {fn summarize_author(&self) -> String {format!("@{}", self.username)}
}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());

trait适用场景

使用 trait 来接受多种不同类型的参数。

//该函数接收一个trait参数,那么只要是实现(impl)了Summary的类型都是有效参数
pub fn notify(item: impl Summary) {println!("Breaking news! {}", item.summarize());
}//trait语法糖 trait bound//这里强制item1,item2必须是相同的具体类型
pub fn notify(item1: T, item2: T) {//使用+号可以同时实现多个trait
pub fn notify(item: impl Summary + Display) {}//impl写法
pub fn notify(item: T) {}//trait bound写法//通过where简化trait bound
//显得杂乱无章
fn some_function(t: T, u: U) -> i32 {}
//使用where之后好看多了
fn some_function(t: T, u: U) -> i32where T: Display + Clone,U: Clone + Debug
{}//一个使用trait boud编写函数的例子
fn largest(list: &[T]) -> T {let mut largest = list[0];for &item in list.iter() {if item > largest {largest = item;}}largest
}//使用trait bound有条件的实现
//通过使用带有 trait bound 的泛型参数的 impl 块,可以有条件地只为那些实现了特定 trait 的类型实现方法。
//示例中的类型 Pair 总是实现了 new 方法,
//不过只有那些为 T 类型实现了 PartialOrd trait (来允许比较) 
//和 Display trait (来启用打印)的 Pair 才会实现 cmp_display 方法:
#![allow(unused)]
fn main() {
use std::fmt::Display;struct Pair {x: T,y: T,
}impl Pair {fn new(x: T, y: T) -> Self {Self {x,y,}}
}impl Pair {fn cmp_display(&self) {if self.x >= self.y {println!("The largest member is x = {}", self.x);} else {println!("The largest member is y = {}", self.y);}}
}
}

trait 和 trait bound 让我们使用泛型类型参数来减少重复,并仍然能够向编译器明确指定泛型类型需要拥有哪些行为。因为我们向编译器提供了 trait bound 信息,它就可以检查代码中所用到的具体类型是否提供了正确的行为。

相关内容

热门资讯

华天动力协同oa系统差-华天动... 哎呀,说到这个华天动力的协同OA系统,我就一肚子火!你知道吗?这个系统简直就是我们公司的一块心病。我...
win10家庭版关闭自动更新-... 哎呀,说到Win10家庭版的自动更新,我就一肚子火!你想想,正在打游戏呢,突然屏幕一黑,系统开始自作...
卢瓦loic汉化版-卢瓦 Lo... 嘿,大家好!今天我要聊的是那个让我们的网络世界更加多彩的卢瓦Loic汉化版!你知道的,那个能让我们的...
nuke rotopaint擦... 哎呀妈呀,今天真是气死我了!我辛辛苦苦在电脑上画的那些小玩意儿,突然间就不见了!原来是那个叫什么“n...
暗黑破坏神2手机移植-暗黑破坏... 嘿,各位暗黑迷们,你们有没有想过,那个让我们彻夜不眠、鼠标键盘敲到手抽筋的《暗黑破坏神2》,现在居然...
公安部重名查询结果惊人,你的名... 哎呀,说起这个公安部重名查询啊,真是让我心里五味杂陈!你有没有想过,自己辛辛苦苦取的名字,在茫茫人海...
安卓系统耗电之谜:应用后台到底... 哎呀,说到这个安卓系统耗电的问题,我真是又爱又恨啊!你知道的,安卓手机那些花里胡哨的功能确实让人爱不...
longne wine qq下... 哎呀,说到这个LongneWineQQ下载,我的心就扑通扑通跳个不停!这可不是普通的下载,这是通往一...
fedora 9 iso-回忆... 嘿,朋友们,还记得那些年我们一起折腾的Fedora9ISO吗?那个让我们又爱又恨的小东西!那时候,谁...
trs互联网舆情管理系统-神秘... 大家好,今天我要给大家扒一扒我们身边的那个神秘“情绪警察”——TRS互联网舆情管理系统。这玩意儿,简...
盗版gta5怎么装警察mod-... 哎呀,各位兄弟姐妹们,今天咱们聊聊一个刺激的话题——在盗版GTA5里装警察Mod!是不是听起来就觉得...
电脑所有软件都打不开-电脑突然... 哎呀,真是急死人了!今天一开电脑,啥软件都打不开,这可咋整啊!屏幕亮了,桌面也出来了,但一点那些图标...
路口监控保存多久-路口监控摄像... 嘿,朋友们,你们有没有想过,那些总是盯着我们的路口监控摄像头,它们拍下来的东西都去哪儿了?它们到底能...
ubuntu 拼音 乱套了-U... 大家好,我是一个每天都得跟电脑打交道的普通用户,最近我可是遇到了一个大麻烦——我的Ubuntu系统上...
server2024企业版激活... 哎呀,说到这个Server2024企业版激活,我这心里头那叫一个激动啊!就像是拿到了一张通往未来世界...
电脑所有的软件都打不开-电脑软... 哎呀呀,天啊,今天真是倒霉透顶了!早上起床,兴冲冲地打开电脑,准备开始一天的工作,结果呢?电脑里的那...
查找的快捷键-查找快捷键大揭秘... 哎呀呀,说到查找的快捷键,我这颗心就扑通扑通跳个不停!你知道吗,每次我在电脑前像个侦探一样,眼睛直勾...
路口监控保存多久-路口监控摄像... 嘿,朋友们,你们有没有想过,那些总是盯着我们的路口监控摄像头,它们拍下来的东西都去哪儿了?它们到底能...
jqs视频文件用什么解码-jq... 哎呀,朋友们,今天咱们就来聊聊这个让人头大的问题——jqs视频文件到底用啥玩意儿解码啊?我这搞视频的...
网络监控用光纤方案图:信息超级... 哎呀,说到这个网络监控用光纤方案图,我这心里的好奇宝宝就开始蹦跶了!你知道吗,这东西就像是我们生活中...