Rust基础-关于trait之三

Rust中各种约束和限定主要由trait来表达,可以说trait是rust的灵魂。接上两篇,本篇继续介绍关于trait的内容。

1、采用impl a Trait简化函数返回值声明

例如:

pub fn chain<I, J>(i: I, j: J) -> iter::Chain<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
    where I: IntoIterator,
          J: IntoIterator<Item = I::Item>
{
    i.into_iter().chain(j)
}

pub fn chain1<I, J>(i: I, j: J) -> impl Iterator//<=====here
    where I: IntoIterator,
          J: IntoIterator<Item = I::Item>
{
    i.into_iter().chain(j)
}
fn main() {
    let v1 = vec![1, 2, 3];
    let v2 = vec![4, 5];
    let mut v3 = chain(v1, v2);
    for s in v3.into_iter(){
    println!("{}",&s);
}

chain的返回类型用chain1直接就ok了,当然chain的返回类型的写法不是有错,只是更加的精确,但如果在某些不需要那么精确的情况下,完全就可以用impl a trait来替换。

那么原因是啥呢?

两张截图,自己体会 :)

同一文件内 

再来看下面的代码:

use std::fmt::{self, Display};
struct node{
    x:i8,
}
impl fmt::Display for node{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({})", self.x)
    }
}
fn fun_trait_result(s:node)->impl Display{
    s.x.to_string()+" from Display trait"
}

fn main() {
    println!("{}",fun_trait_result(node { x: 11 }));
}

 输出

 是的,用->impl Display代替->String 和前面的例子一个意思。

 前面两个例子的完整代码如下:

use std::iter;
use std::vec::IntoIter;

use std::fmt::{self, Display};
struct node{
    x:i8,
}
impl fmt::Display for node{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({})", self.x)
    }
}
fn fun_trait_result(s:node)->impl Display{
    s.x.to_string()+" from Display trait"
}

pub fn chain<I, J>(i: I, j: J) -> iter::Chain<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
    where I: IntoIterator,
          J: IntoIterator<Item = I::Item>
{
    i.into_iter().chain(j)
}
pub fn chain1<I, J>(i: I, j: J) -> impl Iterator
    where I: IntoIterator,
          J: IntoIterator<Item = I::Item>
{
    i.into_iter().chain(j)
}
fn main() {
    let v1 = vec![1, 2, 3];
    let v2 = vec![4, 5];
    let mut v3 = chain(v1, v2);
    for s in v3.into_iter(){
    println!("{}",&s);
    }
    
    println!("{}",fun_trait_result(node { x: 11 }));
}

let's 继续下一话题

2、采用impl a Trait返回闭包,闭包也可以做参数如下:

fn fun_closure<T>(agr: T)->impl Fn(i8,i8)->i8
 where T:Fn(i8,i8) ->i8,{
    let closure=agr;
    closure
} 

fn main() {
    let a=1;
    let b=1;
    let clos=|x:i8,y:i8|{println!("{}",x+y);x+y};
  
    let y=fun_closure(clos);
    println!{"{}",y(a,b)};

}

例子没有实际用处,只是为了说明impl a trait的特性 。

相关文章

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、付费专栏及课程。

余额充值