rust学习(三)泛型和特征对象

Li Guangqiao - 15/07/2023

Rust

泛型和特征对象

泛型解决了多种数据类型可共用一个方法的问题,而特征对象(trait)则提供一种定义和限制泛型行为的方法,特征对象(trait)中封装各类型共享的方法

泛型例子:

use std::ops::Add;

fn add_i8(a:i8,b:i8) -> i8 {
    a+b
}
fn add_i16(a:i16,b:i16) -> i16 {
    a+b
}
fn add_i32(a:i32,b:i32) -> i32 {
    a+b
}
fn add<T:std::ops::Add + Add<Output = T>>(a:T,b:T) -> T {
    a+b
}
fn add_test(){
    println!("{}",add_i8(1,2));
    println!("{}",add_i16(1,2));
    println!("{}",add_i32(1,2));
    println!("{}",add(1,2));
}
#[test]
fn test() {
    add_test();

}

注意: 一个trait只能由方法、类型、常量三部分组成,它描述了一种抽象接口。接口的使用方式,实现trait,默认为类型实现公共方法。

例如:

use std::fmt;
//定义一个工人结构体
struct worker{
    name:String,
    workerId:i32,
    
}
//实现调试打印特征
impl fmt::Debug for worker {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Worker")
            .field("name", &self.name)
            .field("workerId", &self.workerId)
            .finish()
    }
}
//实现worker自我介绍方法
impl  worker {
    fn self_produce(&self){
        println!("{}",self.name);
    }
    
}
//定义行为特征
trait behavior{
    //新类型
    type Tool;
    //常量
    const YEAR:i32 = 2023;
    fn start(&self) {
        println!("start working!!!");
    }
    fn work(&self){
        println!("coding");
    }
    fn end(&self){
        println!("end working!!!");
    }
    //泛型例子,仅实现了fmt::Debug特征的类型可使用此函数
    fn talking_shit<T:fmt::Debug>(&self,name: &T,msg: &T){
        println!("{:?}is ^*** {:?}",name,msg);
    }
    fn init_tool(&self,x: Self::Tool);
}

impl behavior for worker{
    // 确认新类型
    type Tool = String;
  	//重载方法
    fn init_tool(&self,x: Self::Tool){
        println!("{:?},{:?}",Self::YEAR,x);
    }
}
#[test]
fn test(){
    let w = worker{
        name:String::from("mengzhongshadouyou"),
        workerId:123
    };
    w.init_tool(String::from("getting keybroad"));
    w.start();
    w.work();
    w.end();
    w.self_produce();
    w.talking_shit(&String::from("boss"), &String::from("idiot"));
    println!("{:?}",w);
}

多个trait绑定到一起:

第一种是使用'+'为泛型限定多个trait

fn some_func<T:trait1+trait2,U:trait1>(x:T,y:U){
    //DO SOMETHING
}

第二种使用where为泛型限定多个trait

//Where 语法
fn some_func<T,U>(x:T,y:U)
where T:trait1+trait2
	  U:trait1
{
    //DO SOMETHING
}
Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?