丰乐

学习rust(四)泛型及特征

类型-泛型和特征

1 类型系统及其重要性

类型系统:表达能力,编译时的检查

2 泛型

创建泛型

  • Vect
  • 泛型函数 fn f1(val :T)
  • 泛型结构体struct Con

泛型应用

3 用特征抽象行为 trait

trait理解为其他语言的接口,但是可以实现方法,可以注解注入

impl xxx fo yyy{}

特征的表现形式

  1. 标记特征 std::maker里面的 copy send sync
  2. 简单特征
  3. 泛型特征
  4. 关联类型特征
trait Foo{
    type Out;
}
  1. 继承特征

4 特征区间

特征区间

#1
fn xx<T:xx> (){}

#2 where

impl<T> xx for YY<T> where T: Q+P

特征支持继承 traitA:B+C+D{}

5 标准库特征简介

[derive(Default)]

Debug, PartialEq Eq Copy Clone

std::ops std::convert

6 使用特征对象实现真正的多态性

特征多态

  1. 静态分发
  2. 动态分发

特征对象:胖指针

dyn trait引用对象

use std::fmt::Display;
use std::fmt::Debug;


fn main() {
    println!("Hello, world!");
    let a = 1024;
    give_me(a);
    

}

#[derive(Debug)]
struct Square(f32);
#[derive(Debug)]
struct Rectangle(f32, f32);

trait Area: Debug {
    fn get_area(&self) -> f32; 
}

impl Area for Square {
    fn get_area(&self) -> f32 {
        self.0 * self.0
    }
}

impl Area for Rectangle {
    fn get_area(&self) -> f32 {
        self.0 * self.1
    }
}

let shapes: Vec<&dyn Area> = vec![&Square(3f32), &Rectangle(4f32, 2f32)];
for s in shapes {
    println!("{:?}", s);
}


fn surround_with_braces(val: impl Display) -> impl Display {
    format!("{{{}}}", val)
}


struct Foo<T:Display>{
    bar:T
}

struct Bar<F> where F:Display{
    inner:F
}


trait Test1{
    fn test1(&self);
}

trait Playable:Test1{
    fn play(&self);
    fn pause(){
        println!("Paused");
    }
}
struct Audio(String);

impl Playable for Audio{
    fn play(&self){
        println!("now playing: {}", self.0);
    }

}

impl Test1 for Audio{
    fn test1(&self){
        println!("test1: {}", self.0);
    }
}



fn give_me<T>(val :T){
    let _ = val;
}

struct ContIt<T>{
    item:T
}
impl <T> ContIt<T>{
    fn new(i:T)->Self{
        ContIt{item:i}
    }
}

enum Trans<T>{
    Signal(T),
    NoSignal
}






posted on 2021-04-24 21:07  李蝉儿  阅读(227)  评论(0编辑  收藏  举报

导航