泛型的概念

泛型是一种具体类型或者是其他属性的抽象的一种代替:

  • 你编写的泛型代码不是最终的代码,而是一种模板,里面有一些占位符(泛型)
  • 编译器在编译时会将占位符替换为具体的类型

泛型的作用:提高代码的复用能力,处理一些重复代码的问题

泛型的应用

函数中的泛型

  1. fn largest<T>(list:&[T]) -> T {
  2. // ...
  3. }

这段代码上面的T就是占位符,用来代表某一种类型,在编译时会将这个类型最终确定

结构体中的泛型

  1. struct Test<T> {
  2. x: T,
  3. y: T,
  4. }

枚举中的泛型

枚举中的泛型,仅针对枚举中的变体

  1. enum Test2<T> {
  2. name(T),
  3. }
  4. // Option就是为了代替null而出现的
  5. enum Option<T>{
  6. Some(T),
  7. None,
  8. }
  9. enum Result<T,E>{
  10. Ok(T),
  11. Err(E),
  12. }

方法(impl)中的枚举

  1. struct Test<T> {
  2. x: T,
  3. y: T,
  4. }
  5. // impl关键字后面声明是针对泛型结构体的方法
  6. impl<T> Test<T> {
  7. fn x(&self) -> &T {
  8. &self.x
  9. }
  10. }
  11. // 如果是根据具体类型初始化方法,impl后就不要跟泛型类型
  12. impl Test<i32>{
  13. ...
  14. }

注意: 我们第一个针对泛型方法定义的方法,所有类型上都存在这个方法。 而第二个,只存在于i32类型的Test身上