zoukankan      html  css  js  c++  java
  • 学习rust(四)泛型及特征

    类型-泛型和特征

    1 类型系统及其重要性

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

    2 泛型

    创建泛型

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

    泛型应用

    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
    }
    
    
    
    
    
    
    
  • 相关阅读:
    [转]ExtJS3.0与KindEditor4.1.2整合
    [转]Ext.grid常用属性和方法
    Extjs gridpanel 合并单元格
    [转]Httrack工具与使用指南
    [转]Teleport Ultra/Teleport Pro的冗余代码批量清理方法
    [转]最全的用正则批量去除Teleport Pro整站下载文件冗余代码
    Teleport Pro使用教程
    如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换
    [转]使用DW正则表达式批量替换实例介绍
    [转]tppabs是什么?如何去除tppabs?
  • 原文地址:https://www.cnblogs.com/beckbi/p/14698126.html
Copyright © 2011-2022 走看看