Rust基础-关于trait之二

Rust基础-关于trait之一_DarcyZ_SSM的博客-CSDN博客

上一篇写的比较乱一点,仅介绍了一些trait的常用用法,本篇整理一下。

trait的使用方式:

1、静态派发

struct Women;
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
fn shout_static<G: Sound>(g: G) {
    println!("{}", g.shout());
}
shout_static(Women);

2、动态派发

struct Women;
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
fn shout_dynamic(g: Box<dyn Sound>) {
    println!("{}", g.shout());
}
shout_dynamic(Box::new(Women));

3、impl trait

struct Women;
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
fn shout_impl(g: impl Sound) {
    println!("{}", g.shout());
}
shout_impl(Women);

4、关联类型:是 trait 定义中的类型占位符。定义的时候,并不定义它的具体的类型是什么。在实现的时候,才知道它的具体类型是什么。

struct Women;
struct Girl;
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
impl Sound for Girl {
    fn shout(&self) -> &str {
        "Slow down!"
    }
}
trait Convert{
    type Tp;    //关联类型
    fn to_girl(&self)->Self::Tp;
}

impl Convert for Women{
    type Tp=Girl;
    fn to_girl(&self)->Self::Tp{
       Girl
    }
}
 let f=Women;
println!("{}",f.to_girl().shout());

5、泛型

struct Women;
struct Alien;
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
impl Sound for Alien{
    fn shout(&self) -> &str {
        "Bili Bili!"
    }
}
trait  Convert2<T> {
    fn to_alien(&self)->Option<T>;//泛型
    
}

impl Convert2<Alien> for Women{
    fn to_alien(&self)->Option<Alien>{
        Some(Alien)
    }
}
 let f=Women;
 println!("{}",f.to_alien().unwrap().shout());

下面是完整代码:

struct Women;
struct Girl;
struct Alien;
trait Sound {
    fn shout(&self) -> &str;
}
impl Sound for Women {
    fn shout(&self) -> &str {
        "Harder!"
    }
}
impl Sound for Girl {
    fn shout(&self) -> &str {
        "Slow down!"
    }
}
impl Sound for Alien{
    fn shout(&self) -> &str {
        "Bili Bili!"
    }
}

trait Convert{
    type Tp;    //关联类型
    fn to_girl(&self)->Self::Tp;
}

trait  Convert2<T> {
    fn to_alien(&self)->Option<T>;//泛型
    
}
impl Convert for Women{
    type Tp=Girl;
    fn to_girl(&self)->Self::Tp{
       Girl
    }
}
impl Convert for Girl{
    type Tp=Women;
    fn to_girl(&self)->Self::Tp{
       Women
    }
}
impl Convert2<Alien> for Women{
    fn to_alien(&self)->Option<Alien>{
        Some(Alien)
    }
}
//静态派发
fn shout_static<G: Sound>(g: G) {
    println!("{}", g.shout());
}
//动态派发
fn shout_dynamic(g: Box<dyn Sound>) {
    println!("{}", g.shout());
}
//impl trait可以用在函数参数与返回值。
fn shout_impl(g: impl Sound) {
    println!("{}", g.shout());
}
fn main() {
    shout_static(Women);
    shout_dynamic(Box::new(Women));
    shout_impl(Women);
    let f=Women;
    println!("{}",f.to_girl().shout());
    println!("{}",f.to_alien().unwrap().shout());
   
}

相关文章:

Rust基础-关于trait之一_DarcyZ_SSM的博客-CSDN博客

 Rust基础-关于trait之三_DarcyZ_SSM的博客-CSDN博客

Rust基础-关于trait之四-不得不说一下rust fat point_DarcyZ_SSM的博客-CSDN博客

 Rust基础-关于trait之五_DarcyZ_SSM的博客-CSDN博客

 Rust基础-关于trait之六,动态派发和静态派发的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值