Trait
一、概念
1.Trait概念
Trait 是某种类型具有哪些并且可以与其它类型共享的功能。它把类型间的共享行为进行抽象定义,Trait bounds是指泛型类型参数指定为实现了某种特定行为约束的类型。
2.Trait的作用
- 作为接口使用。
- 类型标记Copy,Sized,通过类型标记IDE可以识别一些固定类型的行为。
- 泛型限定、入参和出参作为泛型限制。
- 抽象类型相当于动态语言调用,静态调用,动态调用、动态分发。
3.概念和C++的虚函数差不多,差异在于rust没有类继承的概念。
一、Trait做为接口使用
1.Trait的定义
//使用关键字trait把方法签名放在一起,来定义实现某种目的必须的一组行为 //这里使用文章做例子,所有的文章都有标题和作者,不管是博客还是论文 pub trait Article {
//只有方法签名,没有具体实现,可以有多个方法 fn digest(&self) ->String; //默认实现 fn aothor(&self) {
println!("默认实现"); } }
讯享网
2.实现Trait
讯享网pub struct WeChatArticle {
pub aothor : String,//作者 pub title : String,//标题 pub timestamp : String//创建时间戳 } pub struct Blog {
pub aothor : String,//作者 pub title : String,//标题 pub collect : u64//收藏个数 } //为类型实现trait impl Article for Blog {
fn digest(&self) ->String {
self.title.clone() + &self.title.clone() + &self.collect.to_string() } } impl Article for WeChatArticle {
fn digest(&self) ->String {
self.title.clone() + &self.title.clone() + &self.timestamp.clone() } }
3.使用
use rust_demo::Blog; use rust_demo::Article; fn main() {
let blog : Blog = Blog {
aothor:"matt".to_string(), title:"Rust Trait 的应用".to_string(), collect: 20 }; println!("Blog aothor is {}",blog.digest()); }s
4.Trait的默认实现
讯享网pub trait article {
//这个为Trait的默认实现,如果类型没有重写这个方法,则使用默认实现 fn aothor(&self) ->String {
self.aothor.clone() } fn title(&self) ->String; }
二、Trai作为参数使用
1.以参数的形式传入
//item是实现了Article这个Trait的类型 pub fn notify(item : impl Article) {
print!("Article digest {} \n",item.digest()); }
使用
讯享网fn main() {
let blog : Blog = Blog {
aothor:"matt".to_string(), title:"博客文章".to_string(), collect: 20 }; let wechar :WeChatArticle = WeChatArticle {
aothor:"matt".to_string(), title:"微信公众号文章".to_string(), timestamp:"".to_string() }; notify(blog); notify(wechar); }

2.泛型形式写法
//item是实现了Article这个Trait的类型,泛型写法对传入不用的类型阅读更友好 pub fn notify<T:Article>(item_1: T,item_2 : T) {
print!("Article digest {} \n",item_1.digest()); }
3.多个Trait约束
讯享网//item是实现了Article和Display两个Trait pub fn notify<T:Article + Display>(item_1: T) {
print!("Article digest {} \n",item_1.digest()); }
使用where子句实现Trait约束
pub fn notify<T,U>(item_1: T,item_2 : U) where T : Article + Display, //T要现了这两个Trait约束 U : Clone + Debug, {
print!("Article digest {} \n",item_1.digest()); }
三、实现Trait作为返回类型
讯享网//只能返回确定的同一种类型,返回不周类型会的代码会报错 pub fn notify( b : bool) -> impl Article {
//这样会报错 // if(true) // {
// Blog // { // aothor:"matt".to_string(), // title:"博客文章".to_string(), // collect: 20 // } // } // else // {
// WeChatArticle // { // aothor:"matt".to_string(), // title:"微信公众号文章".to_string(), // timestamp:"".to_string() // } // } WeChatArticle {
aothor:"matt".to_string(), title:"微信公众号文章".to_string(), timestamp:"".to_string() } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/35899.html