前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rust泛型和特征

rust泛型和特征

原创
作者头像
李子健
发布2022-05-05 23:14:26
3740
发布2022-05-05 23:14:26
举报
文章被收录于专栏:每日一善每日一善

为什么需要泛型

  • 更有表达力
  • 编写代码时需要更多的思考和构造

rust的泛型和其他语言类似,常用的几种场景,可以在代码里面看到

  • 方法泛型
  • struct泛型
  • 泛型struct的方法实现

使用特征扩展类型。特征和java8之后的接口很像啊

  • 类似java的接口
  • 支持关联方法,实现方法
  • 支持继承

特征的分类,主要是指特征的使用场景

  • 空方法的标记特征,类似空的注解
  • 简单特征,泛型特征,关联特征,继承特征

特征区间,通过特征确定方法或者类的范围

  • 支持区间
  • 泛型函数和impl代码的特征区间
  • where

标准库特征

  • Debug
  • PartialEq和Eq
  • Copy和Clone

泛型的实现

  • 静态分发,编译时决定调用
  • 动态分发,运行时决定,通过续表的接口列表去查找对应的类,额外的资源开销

rust支持动态分发

  • 特征对象,实现为胖指针,变量后面加上&
  • rust的动态对象 &dyn,通常用的比较少
代码语言:rust
复制
use std::fmt::Debug;

fn test1<T>(value:T) {
    let _ = value;
}


enum Tsss<T> {
    Signal(T),
    Nosignal
}


struct GenericS2<T>{
    item:T
}

impl<T> GenericS2<T> {
    fn newGenericS2(i :T) -> Self {
        GenericS2{item:i}
    }
}

impl GenericS2<u32> {
    fn newGenericS2Int(i :u32) -> Self {
        GenericS2{item:i}
    }
}

trait Playable {
    fn play(&self);
    fn pause() {
        println!("Paused");
    }
}

struct Audio(String);
struct Video(String);
impl Playable for Audio {
    fn play(&self){
        println!("audio {}", self.0)
    }
}

impl Playable for Video {
    fn play(&self){
        println!("video {}", self.0)
    }
}

struct A;
struct B;
struct C;

trait InitA{
    fn init(&self);
}
impl InitA for A{
    fn init(&self){
        println!("init a");
    }
}

impl InitA for B{
    fn init(&self){
        println!("init b");
    }
}

impl C {
    fn ainit<T: InitA>(&self, s:T) {
        s.init();
    }
}

trait A1{
    fn a1(&self) {
        println!("a1")
    }
}

trait A2{
    fn a2(&self) {
        println!("a2")
    }
}
trait A3{
    fn a3(&self) {
        println!("a3")
    }
}

trait A4 : A1+A2+A3{
    fn a4(&self) {
        self.a1();
        self.a2();
        self.a3();
        println!("repeat!")
    }
}

struct Bb;
impl A1 for Bb{}
impl A2 for Bb{}
impl A3 for Bb{}
impl A4 for Bb{}

trait Entable {
    fn eat(&self);
}
#[derive(Debug)]
struct Food<T>(T);
#[derive(Debug)]
struct Apple;
impl<T> Entable for Food<T> where T:Debug {
    fn eat(&self) {
        println!("eater {:?}", self);
    }
}

fn eat<T>(val:T) where T:Entable {
    val.eat();
}



fn main() {

    let apple = Food(Apple);
    eat(apple);


    println!("Hello, world!");
    test1(12);
    test1("a");

    let s2 = GenericS2::newGenericS2(123);

    let mut vec1:Vec<u8> = Vec::new();
    vec1.push(1);

    let video1 = Audio("abc".to_string());
    video1.play();

    let cx = C;
    cx.ainit(A);
    cx.ainit(B);


    Bb.a4();

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com