Please enable Javascript to view the contents

[Rust 基础知识]初探泛型

 ·  ☕ 1 分钟

前言

    本文囊括 Rust 中泛型的主要知识点。

泛型的一般形式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
enum MyOption<T> {
    Some(T),
    None,
}

struct Num<T=i32> {
    data: Option<T>
}

fn test_fn<T>(param: T) -> bool

fn test_fn<T, U>(param: T, param2: U) -> bool

impl<T, U> Into<U> for T
    where U: From<T>
    {
        fn into(self) -> U {
            U::from(self)
        }
    }

泛型参数约束

Rust 中有两种方法给泛型参数添加约束:
第一种通过冒号指定:

1
fn max<T: PartialOrd>(a: T, b: T) -> T {}

第二种使用 where 子句指定:

1
2
fn max<T>(a: T, b: T) -> T
    where T: PartialOrd

一般简单约束可以用冒号,复杂的用 where 子句。我们可以理解冒号用法都能转换成 where 子句,反之并不能。

1
2
fn max(self) 
    where Self: Sized

类似上例这种就无法用冒号代替。

关联类型

trait 中不仅可以包含方法和常量,还可以包含类型。这种类型叫做关联类型。

1
2
3
pub trait MyType {
    type MyInnerType;
}

一个使用它的经典场景就是在泛型中约束特定元素的迭代器:

1
2
3
fn test_fn(mut iter: ITER)
    where ITER: Iterator,
          ITER::Item: Debug

关联类型和普通的泛型参数在功能上有重叠,一般在选择时主要关注类型是否需要这个 trait 多次,例如 AsRef 我们就可以实现多次,因为我们可以 AsRef 成不同的类型。
而像 Deref 这种肯定更希望只实现一次,这时就可以考虑关联类型。

泛型特化

特化的三个意义:

  • 性能优化:针对统一抽象的特殊场景做特殊处理
  • 代码重用:提供默认实现,有时能减少代码
  • 作为 trait 系统“高效继承”的基础

具体的以后单开再聊。

分享

saberuster
作者
saberuster
一个喜欢编程和折腾的追风少年