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 信息,它就可以检查代码中所用到的具体类型是否提供了正确的行为。

相关内容

热门资讯

windows恢复器 继续系统... Windows恢复器:继续系统恢复的全面指南在Windows操作系统中,系统恢复是一个非常重要的功能...
windows电视系统,融合智... Windows电视系统:融合智能与办公的全新体验Windows电视系统的优势相较于传统的安卓电视系统...
windows备份系统命令,轻... Windows系统备份命令详解:轻松实现数据安全随着信息技术的不断发展,数据安全成为每个用户和企业关...
windows操作系统的文件组... Windows操作系统的文件组织:结构、原理与应用Windows文件组织 文件系统结构 文件路径 文...
windows和mac双系统安... Windows和Mac双系统安装教程 Windows双系统安装教程 1. 准备工作在开始安装双系统之...
windows恢复上一次系统 Windows恢复上一次系统的详细指南在Windows操作系统中,我们有时会遇到系统崩溃、软件冲突或...
windows的系统目录在哪里... Windows系统目录的位置详解在Windows操作系统中,系统目录是存放操作系统核心文件和配置文件...
windows打不开系统菜单,... Windows系统菜单打不开?解决方法大揭秘在日常生活中,我们经常使用电脑,而Windows系统菜单...
windows定期重启系统,W... Windows定期重启系统的必要性及设置方法在计算机使用过程中,定期重启系统是一种常见的维护方式。它...
安装系统重新分配c盘,步骤详解... 安装系统重新分配C盘:步骤详解与注意事项随着电脑使用时间的增长,C盘空间不足的问题时常困扰着用户。重...
windows的帮助系统在哪,... Windows帮助系统在哪?全面解析在Windows操作系统中,帮助系统是一个非常重要的功能,它能够...
windows操作系统原理好书... 深入探索Windows操作系统原理——好书推荐指南一、基础理论篇在深入学习Windows操作系统原理...
Windows盗版系统哪个好,... Windows盗版系统哪个好?揭秘盗版Windows的优劣随着计算机技术的普及,Windows操作系...
windows更改系统管理员账... Windows系统管理员账户更改指南在Windows操作系统中,管理员账户是拥有最高权限的用户账户,...
windows更新取消更新系统... 如何取消Windows更新系统升级?避免系统自动更新的烦恼一、了解Windows更新系统升级的必要性...
windows电脑系统版权,W... Windows电脑系统版权的重要性及正版与盗版的区别一、Windows系统版权的重要性1. 保护软件...
windows电脑还原系统按哪... Windows电脑还原系统:按哪个键轻松恢复?在电脑使用过程中,系统崩溃、文件丢失等问题时有发生。为...
windows不能安装wind... Windows系统安装失败:原因及解决方案在电脑使用过程中,遇到Windows系统无法安装的情况并不...
windows安装系统找不到分... Windows安装系统找不到分区的原因及解决方法在安装Windows操作系统时,有些用户可能会遇到“...
windows还原系统时间,W... Windows系统还原时间详解随着电脑使用时间的增长,系统问题也日益凸显。为了解决这些问题,Wind...