泛型:如何使用它们并在Rust中实现它们

221 阅读2分钟

当我们想为多种情况编写代码时,我们使用泛型。它为我们提供了声明占位符的基元,使我们能够减少对特定类型的关注。它允许我们通过减少代码的重复和提供类型安全来编写更简洁干净的代码。

泛型函数

在泛型定义中,我们将类型参数写在名称后面的开角括号和闭角括号之间。在Rust中,泛型也描述了任何接受一个或多个泛型参数的东西**。** T代表任何数据类型。

语法:

pub fn function_name<T>(param:T)

T已经被指定为使用**的通用类型参数当制作T类型的参数**时,它被认为是通用的。该参数可以是任何类型的。

例子:

fn main() {
    let sum_int_value = addition_of_values(3,5);
    println!("Addition of Integer values : {:?}",sum_int_value);
    let sum_float_value = addition_of_values(3.1,5.5);
    print!("Addition of Float values : {:?}",sum_float_value);
}

pub fn addition_of_values<T: PartialOrd + std::ops::Add<Output = T>>(num1: T, num2: T) -> T {
    num1 + num2
}

输出 :

特质的泛型

Traits也可以是泛型的。特质可以包含方法抽象方法。特质定义是对方法签名进行分组的一种方式,以定义完成某些目的所需的一组行为。

语法:

trait some_trait {
   //abstract method
   fn method1(&self);
   
   fn method2(&self){
     //contents of method
   }
}

例子:

pub trait Summary {
    fn summarize_author(&self) -> String;

    fn summarize(&self) -> String {
        format!("(Read more from {}...)", self.summarize_author())
    }
}

pub fn notify<T: Summary>(item: &T) {
    println!("Breaking news! {}", item.summarize());
}

被指定为项目参数类型的泛型T 制约着该函数。

泛型结构

要定义一个泛型结构,我们将类型参数写在结构名称之后,介于开放封闭的角括号之间。要定义一个结构,我们要输入关键字struct并命名整个结构。

语法:

struct STRUCT_NAME<T> {
    field:T,
    field:T,
}

然后,在大括号内,我们定义数据块的名称和类型,我们称之为字段

例子 :

fn main() {
    let int_point = Point {
        num1:4,
        num2:5
    };
    println!("Integer points : {:?}",int_point);
    
    let float_point = Point {
        num1:4.5,
        num2:5.5
    };
    println!("Floating points : {:?}",float_point);
}
#[derive(Debug)]
struct Point<T> {
    num1: T,
    num2: T,
}

输出 :

通用枚举

枚举允许你通过枚举其可能的类型来定义一个类型。 变体.Rust默认为我们提供了两个Enums。

  • 选项<T
  • 结果<T, E>。

选项<T

Option枚举代表一个可选的值。最重要的是,每个选项都有Some和包含一个值,或者None和不包含一个值。

语法:

enum Option<T> {
    Some(T),
    None,
}

例子 :

fn main() {
    let result = find_max_value(5,0);
    match result{
        Some(_) => println!("Num1 is maximum"),
        None => println!("Num2 is maximum")
    }
}

fn find_max_value<T: PartialOrd + std::ops::Rem<Output = T>>(num1:T,num2:T) -> Option<T> {
    match num1 > num2 {
        true => Some(num1),
        false => None
    }
}

输出。

结果<T,E>

结果枚举代表成功**(Ok**)或失败**(Err**)。有时,表达一个操作失败的原因是很重要的。在这种情况下,我们必须使用结果枚举。

语法:

enum Result<T,E> {
    Ok(T),
    Err(E),
}
  • Ok(value)。表示操作成功的类型为T
  • Err(why)。表示该操作失败WhyE类型。

例子:

fn main() {
    let result = find_max_value(5,5);
    match result{
        Ok(value) => println!("Maximum value is : {}",value),
        Err(error) => println!("Error Message : {}",error)
    }
}

fn find_max_value(num1:i32,num2:i32) -> Result<i32,String> {
    match num1 > num2 {
        true => Ok(num1),
        false => Err("Equal numbers".to_string())
    }
}

输出。

所以希望你能了解Rust中泛型的使用方法。

谢谢你的阅读!!