Rust - 泛型类型

  • 简述

    泛型是一种为具有不同类型的多个上下文编写代码的工具。在 Rust 中,泛型是指数据类型和特征的参数化。泛型允许通过减少代码重复和提供类型安全来编写更简洁和干净的代码。泛型的概念可以应用于方法、函数、结构、枚举、集合和特征。
    <T> 语法称为类型参数,用于声明泛型构造。T代表任何数据类型。

    说明:通用集合

    以下示例声明了一个只能存储整数的向量。
    
    fn main(){
       let mut vector_integer: Vec<i32> = vec![20,30];
       vector_integer.push(40);
       println!("{:?}",vector_integer);
    }
    

    输出

    
    [20, 30, 40]
    
    考虑以下片段 -
    
    fn main() {
       let mut vector_integer: Vec<i32> = vec![20,30];
       vector_integer.push(40);
       vector_integer.push("hello"); 
       //error[E0308]: mismatched types
       println!("{:?}",vector_integer);
    }
    
    上面的例子表明整数类型的向量只能存储整数值。因此,如果我们尝试将字符串值推送到集合中,编译器将返回错误。泛型使集合类型更安全。

    说明:通用结构

    type 参数代表一个类型,编译器稍后会填写。
    
    struct Data<T> {
       value:T,
    }
    fn main() {
       //generic type of i32
       let t:Data<i32> = Data{value:350};
       println!("value is :{} ",t.value);
       //generic type of String
       let t2:Data<String> = Data{value:"Tom".to_string()};
       println!("value is :{} ",t2.value);
    }
    
    上面的示例声明了一个名为Data的通用结构。所述<T>类型指示某些数据类型。在main()函数创建两个实例-结构的一个整数实例和一个字符串实例。

    输出

    
    value is :350
    value is :Tom
    
  • 特性 (trait)

    Traits 可用于跨多个结构实现一组标准的行为(方法)。特质就像interfaces在面向对象编程中。trait 的语法如下所示 -

    声明一个特性

    
    trait some_trait {
       //abstract or method which is empty
       fn method1(&self);
       // this is already implemented , this is free
       fn method2(&self){
          //some contents of method2
       }
    }
    
    Traits 可以包含具体方法(带有主体的方法)或抽象方法(没有主体的方法)。如果方法定义将由实现 Trait 的所有结构共享,请使用具体方法。但是,结构可以选择覆盖由特征定义的函数。
    如果方法定义因实现结构而异,请使用抽象方法。

    语法 - 实现 trait

    
    impl some_trait for structure_name {
       // implement method1() there..
       fn method1(&self ){
       }
    }
    
    以下示例使用方法print()定义了一个特征Printable,该方法由结构体book 实现
    
    fn main(){
       //create an instance of the structure
       let b1 = Book {
          id:1001,
          name:"Rust in Action"
       };
       b1.print();
    }
    //declare a structure
    struct Book {
       name:&'static str,
       id:u32
    }
    //declare a trait
    trait Printable {
       fn print(&self);
    }
    //implement the trait
    impl Printable for Book {
       fn print(&self){
          println!("Printing book with id:{} and name {}",self.id,self.name)
       }
    }
    

    输出

    
    Printing book with id:1001 and name Rust in Action
    
  • 通用函数

    该示例定义了一个泛型函数,用于显示传递给它的参数。参数可以是任何类型。参数的类型应该实现 Display trait,以便它的值可以被 println! 宏。
    
    use std::fmt::Display;
    fn main(){
       print_pro(10 as u8);
       print_pro(20 as u16);
       print_pro("Hello TutorialsPoint");
    }
    fn print_pro<T:Display>(t:T){
       println!("Inside print_pro generic function:");
       println!("{}",t);
    }
    

    输出

    
    Inside print_pro generic function:
    10
    Inside print_pro generic function:
    20
    Inside print_pro generic function:
    Hello TutorialsPoint