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

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...