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不能开机重新安装... Windows无法开机?教你重新安装系统轻松解决问题在日常生活中,电脑作为我们工作和娱乐的重要工具,...
windows备份系统,Win... Windows系统备份的重要性及操作指南随着电脑在日常工作和生活中的广泛应用,数据安全成为用户关注的...
windows画图系统,轻松绘... Windows画图工具:轻松绘制,创意无限在Windows操作系统中,画图工具(mspaint)是一...
windows安装iso文件怎... Windows安装ISO文件:轻松安装系统的完整指南一、什么是ISO文件?ISO文件是一种磁盘映像文...
windows捕获系统异常事件... 深入解析Windows系统异常事件的捕获与处理在计算机操作过程中,系统异常事件是难以避免的问题。了解...
安装系统重启屏幕不亮,安装系统... 安装系统后重启屏幕不亮的原因及解决方法在电脑使用过程中,遇到安装系统后重启屏幕不亮的情况并不少见。这...
windows安全模式修复系统... Windows安全模式修复系统还原:全面解析与操作指南在Windows操作系统中,安全模式是一种在系...
包组装安装系统驱动,电脑组装与... 电脑组装与系统驱动安装全攻略一、电脑组装前的准备工作在开始组装电脑之前,我们需要做好以下准备工作: ...
windows电脑xp系统升级... Windows XP系统升级指南:轻松实现系统升级一、升级前的准备工作在开始升级Windows XP...
windows更新系统0%,W... Windows更新系统停滞在0%的解决方法详解在Windows操作系统中,定期更新是确保系统安全性和...
windows的系统事件日志,... 深入解析Windows系统事件日志:监控与维护系统安全的关键在Windows操作系统中,系统事件日志...
windows操作系统功能,w... Windows 11操作系统:功能全面升级,体验更上一层楼二、外观设计1. 全新界面Windows ...
windows的系统盘文件,结... Windows系统盘文件详解:结构、作用与维护在Windows操作系统中,系统盘是至关重要的部分,它...
北京安装并线辅助系统,提升生产... 北京安装并线辅助系统:提升生产效率,保障产品质量随着工业自动化程度的不断提高,安装并线辅助系统在制造...
斑马系统怎么安装程序,斑马系统... 斑马系统程序安装指南斑马系统是一款广泛应用于工业、商业和物流等领域的嵌入式操作系统。本文将详细介绍如...
windows换苹果系统导数据... Windows换苹果系统,轻松导数据攻略一、了解数据迁移的重要性在进行Windows到苹果系统的切换...