Rust 入门 泛型

泛型

  • 提高代码的复用能力
    • 处理代码的重复问题
  • 泛型是具体的数据类型或者其他属性的抽象代替
    • 泛型就相当于数据类型的占位符
    • 编译器在编译的时候就会替换泛型为具体的数据类型, 这个过程被称为单态化(monomorphization)
  • 泛型参数名通常使用一个字母, 大多数情况下使用 T 表示, 因为字母 T 是单词 type 的缩写
  • 泛型可以有多个, 声明多个泛型时使用半角逗号分隔
  • 使用泛型时必须先声明泛型
fn largest<T> (list: &[T]) -> T {
    
}

fn main()  {
    // i32类型的数组
    let arr = [10, 20, 15, 40];
    // 此时泛型在编译时会被替换为 i32
	let num = largest(&arr);
}

在函数中使用泛型

  • 函数中的泛型类型通常是定义函数的参数类型和返回值类型
  • 定义在方法签名中
// 不使用泛型
fn largest_1(list: &[i32]) -> i32 { }
// 使用一个泛型类型
fn largest_2<T>(list: &[T]) -> T { }
// 使用多个泛型类型
fn largest_3<T, E>(arg1: T, arg2: E) { }

// fn largest_2<T>(list: &[T]) -> T
// <T> 表示我们声明了一个泛型
// list: &[T] 表示参数`list`的数据类型是 泛型T的切片
// -> T 表示函数的返回值的类型是 T

在结构体中使用泛型

  • 结构体中的泛型类型通常是定义字段的数据类型
  • 定义在结构体标识符的后面
struct Point<T> {
    x: T,
    y: T,
}

struct Location<T, E> {
    x: T,
    y: E,
}

在枚举中使用泛型

  • 枚举中的泛型类型可以让枚举的变体持有泛型数据类型
  • 定义在枚举标识符的后面
enum Option<T> {
    Some(T),
    None,
}

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

在方法中使用泛型

  • 为结构体或者枚举实现方法时, 可以使用泛型
struct Point<T> {
    x: T,
    y: T,
}

// 为结构体方法实现泛型参数
impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
    // 为方法添加独立的泛型参数
    fn mix<E>(&self, value: T, oud: E) {
        
    }
}

// 针对具体的类型为结构体实现方法
impl Point<i32> {
    fn y(&self) -> &i32 {
        &self.y
    }
}
如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-06-23 15:09  Delayer  阅读(214)  评论(0编辑  收藏  举报