Rust 泛型

发布时间: 更新时间: 总字数:485 阅读时间:1m 作者: IP上海 分享 网址

Rust中泛型可以提高代码的复用能力,多用于处理重复代码问题。

什么是泛型

泛型 是具体类型或其他属性的抽象代替,可以理解为占位符,Rust在编译时,编译器会将占位符替换为具体的类型。

  • 示例
fn largest<T>(list: &[T]) -> T {...}

说明:

  • T 缩写是 type,代表参数类型,T 就是占位符,也可以使用其他的字母代替,如:E
    • 不建议定义多个泛型参数,若多个泛型参数,可以拆分更多小的单元
  • 通常泛型函数中,参数类型和返回类型

struct 中定义泛型

#[derive(Debug)]
//struct Point<T> {
struct Point<T, E> {
    x: T,
    //y: T,
    y: E,
}

fn main() {
    let a = Point{x:1, y:2};
    println!("{:?}", a);
}

enum 中定义泛型

枚举的变体可以定义为泛型数据类型,示例:

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

enum Result<T, E> {
    Ok(T),
    Err(E),
}

方法中定义泛型

为 struct 或 enum 实现(impl)方法的时候,也可以在定义中使用泛型

#[derive(Debug)]
pub struct Point<T> {
// struct Point<T, E> {
    x: T,
    y: T,
    //y: E,
}

impl<T> Point<T> {
    pub fn x(&self) -> &T {
        &self.x
    }
}

impl Point<i32> {
    pub fn y(&self) -> &i32 {
        &self.y
    }
}

fn main() {
    let a = Point{x:1, y:2};
    println!("{:?}, x: {}, y: {}", a, a.x, a.y);
}

说明:

  • impl<T> Point<T> {} 表示在类型 T 上实现方法
  • impl Point<i32> {} 表示仅针对 i32 类型实现方法
  • struct 里的泛型类型参数可以和方法的泛型类型参数不同

其他

  • 使用泛型的代码和使用具体类型的代码的运行速度是一样的
    • 因为:Rust 在编译时通过 单态化(monomorphization),将泛型转化为具体类型
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数