乱读天书, 不求甚解
周祎骏的个人云笔记
Toggle navigation
乱读天书, 不求甚解
主页
Linux:系统配置
Linux:用户管理
Linux:优化排错
Linux:进程调度
Linux:文件系统
Linux:网络
Linux:系统服务
Linux:安全
Linux:内核
容器:Docker
容器:containerd
容器编排:Kubernetes
IAC:Terraform
大数据:Hadoop
大数据:Zookeeper
大数据:Hbase
消息队列:rsyslog
消息队列:kafka
数据库:MySQL
数据库:MongoDB
搜索引擎:Elasticsearch
时序数据库:OpenTSDB
网站服务:Nginx
编程:Bash
编程:Perl
编程:Python
编程:C
编程:JAVA
编程:Rust
版本控制:gitlab
知识管理:docusaurus
常用小工具
关于我
标签
Rust 06.01 trait
2023-02-05 10:10:59
60
0
0
admin
> Rust 的trait 类似于接口 **只有在trait 或类型定义在我们的库中时,我们才能为该类型实现对应的trait,这样确保其他人不会破坏你的代码,反之亦然** ```rust pub trait User { fn get_name(&self) -> String; //定义必须有的方法 fn get_id(&self) -> i32 { //定义必须有的方法的默认方法 121 } } pub struct Teacher { pub teacher_name: String, pub id: i32, } impl User for Teacher { //定义Teacher 满足User trait fn get_name(&self) -> String { self.teacher_name.clone() } } pub struct Doctor { pub doctor_name: String, pub id: i32, } impl User for Doctor { fn get_name(&self) -> String { self.doctor_name.clone() } } fn main() { let Peter = Teacher { teacher_name:"Peter".to_string(),id:1}; let Jack = Doctor { doctor_name:"Jack".to_string(),id:2}; println!("{}",Peter.get_id()); println!("{}",Jack.get_name()); } ``` *** ## trait 约束 ```rust pub fn func_name(item: impl trait_name){ //定义方法可以接受任何实现了该trait 的类型 xxx } pub fn func_name<T: trait_name>(item:T){ //和上面一样 xxx } pub fn func_name(item1: impl trait1, item2: impl trait2) {} //定义方法接受的参数必须分别实现了trait1 和trait2 pub fn func_name<T:trait_name>(item1:T,item2:T) {} //定义方法接受的两个参数必须实现了trait 而且必须是同一种类型 pub fn func_name(item: impl trait1 + trait2) {} //定义方法接受的参数必须满足两种trait pub fn func_name<T: trait1 + trait2 >(item:T) {} pub fn func_name<T,U>(t:T,u:U) //用where 写trait 约束 where T: trait1 + trait2, U: trait3 + trait4, { xxx } pub fn func_name() -> impl trait {} // 返回值必须满足trait ``` # 只能接受支持某一trait的泛型 ``` Vec<Box<dyn Abc>> ``` 一个动态数组,每一个元素都是一个Box指针 指针指向的类型必须是支持Abc trait 的
上一篇:
Rust 06.00 泛型
下一篇:
Rust 06.02 生命周期标注
文档导航