Rust泛型


泛型是一种为具有不同类型的多个上下文编写代码的工具。在Rust中,泛型是指数据类型和特征的参数化。泛型可以通过减少代码重复并提供类型安全性来编写更简洁明了的代码。泛型的概念可以应用于方法,功能,结构,枚举,集合和特征。

The称为类型参数,用于声明泛型构造。 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");
    //错误[E0308]:类型不匹配
    println!("{:?}",vector_integer);
}

上面的示例显示整数类型的向量只能存储整数值。因此,如果我们尝试将字符串值推入集合,则编译器将返回错误。泛型使集合更安全。

例子:通用结构

type参数表示一种类型,编译器稍后将填充该类型。

struct Data<T> {
    value:T,
}
fn main() {
    // i32的通用类型
    let t:Data<i32> = Data{value:350};
    println!("value is :{} ",t.value);
    //字符串的通用类型
    let t2:Data<String> = Data{value:"Tom".to_string()};
    println!("value is :{} ",t2.value);
}

上面的示例声明了一个名为 Data . The

value is :350
value is :Tom

Traits


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

traits声明

trait some_trait {
    //抽象或为空的方法
    fn method1(&self);
    //这已经实现
    fn method2(&self){
        // method2的一些内容
    }
}

性状可以包含具体方法(带主体的方法)或抽象方法(不带主体的方法)。如果方法定义将由实现该Trait的所有结构共享,请使用一种具体方法。但是,结构可以选择覆盖由特征定义的功能。

如果方法定义因实现结构而异,请使用抽象方法。

语法-实现trait

impl some_trait for structure_name {
    //在此处实现method1()。
    fn method1(&self ){
    }
}

以下示例定义了一个trait Printable,包含一个print()方法,由结构体book实现。

fn main(){
    //创建结构的实例
    let b1 = Book {
        id:1001,
        name:"Rust in Action"
    };
    b1.print();
}
//声明一个结构
struct Book {
    name:&'static str,
    id:u32
}
//声明一个特征
trait Printable {
    fn print(&self);
}
//实现特质
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 newbiego");
}

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 newbiego