Rust 泛型

17 Mar 2025 | 5 分钟阅读

当我们想要创建具有多种形式的函数时,即函数的参数可以接受多种数据类型。这可以通过泛型来实现。泛型也称为“参数多态性”,其中 poly 表示多种,morph 表示形式。

有两种方法可以提供泛型代码

  • Option<T>
  • Result<T, E>
Rust Generics

1. Option<T>: Rust 标准库提供了 Option其中 'T' 是泛型数据类型。它提供了对一种类型的泛型。

在上述情况下,enum 是自定义类型,其中 <T> 是泛型数据类型。我们可以用任何数据类型替换 'T'。让我们看看这个

在上述情况下,我们观察到 'T' 可以是任何类型,即 i32、bool、f64 或 char。但是,如果左侧的类型和右侧的值不匹配,则会发生错误。让我们看看这个


在上述情况下,左侧的类型是 i32,右侧的值的类型是 f64。因此,会出现错误“类型不匹配”

2. Result<T,E>:Rust 标准库提供了另一个数据类型 Result<T,E>,它对两种类型(即 T 和 E)进行泛型:

注意:我们不必使用 'T' 和 'E' 是一种约定。我们可以使用任何大写字母。

泛型函数

泛型可以用于函数中,我们将泛型放置在函数的签名中,其中指定了参数和返回值的 ​​数据类型。

  • 当函数包含类型为 'T' 的单个参数时.

语法

上述语法包含两个部分:

  • <T>:给定的函数是对一种类型的泛型。
  • (x : T):x 的类型为 T。

当函数包含多个相同类型的参数时.

当函数包含多种类型的参数时。


结构体定义

结构体也可以使用泛型类型参数在一个或多个字段中使用 <> 运算符。

语法

在上述语法中,我们在结构体名称后方的尖括号内声明泛型类型参数,然后我们可以在结构体定义中使用泛型类型。

让我们看一个简单的例子:

输出

integer values : 2,3
Float values : 7.8,12.3

在上面的例子中,Value<T> 结构体是对一种类型的泛型,并且 a 和 b 的类型相同。我们创建了两个实例 integer 和 float。integer 包含 i32 类型的值,float 包含 f64 类型的值。

我们来看另一个简单的示例。

输出

Rust Generics

在上面的例子中,Value<T> 结构体是对一种类型的泛型,并且 a 和 b 的类型相同。我们创建了一个“c”实例。“c”包含不同类型的值,即 i32 和 f64。因此,Rust 编译器会抛出“类型不匹配”错误。

枚举定义

枚举也可以使用泛型数据类型。Rust 标准库提供了 Option<T> 枚举,它保存泛型数据类型。 Option<T> 是一个枚举,其中 'T' 是泛型数据类型。

  • Option<T>

它由两个变体组成,即 Some(T) 和 None。

Rust Generics

其中 Some(T) 包含类型 T 的值,而 None 不包含任何值。

让我们来看看


在上述情况下,Option是一个枚举,它对一种类型 'T' 进行泛型。它由两个变体 Some(T) 和 None 组成。

  • Result<T, E>:我们可以创建多种类型的泛型。这可以通过 Result<T, E> 实现。

在上述情况下,Result<T, E> 是一个枚举,它对两种类型进行泛型,并且它由两个变体组成,即 OK(T) 和 Err(E)。

OK(T) 包含类型为 'T' 的值,而 Err(E) 包含类型为 'E' 的值。

方法定义

我们可以在结构体和枚举上实现方法。

让我们看一个简单的例子

输出

p.a() is 5

在上面的例子中,我们在 Program<T> 上实现了名为 'a' 的方法,该方法返回对变量 a 中存在的数据的引用。

我们在 impl 之后声明了 'T',以指定我们在 Program<T> 上实现该方法。

解决歧义

Rust 编译器会自动推断泛型参数。让我们通过一个简单的场景来理解这一点

在上面的例子中,我们将整数值插入到向量中。因此,Rust 编译器了解到向量 v 的类型为 i32。

如果我们删除倒数第二行,它看起来像;

上面的情况会抛出一个错误,即“它无法推断 T 的类型”。

  • 我们可以通过两种方式解决上述情况

1. 我们可以使用以下注释

2. 我们可以使用“turbofish”::<> 运算符绑定泛型参数 'T'


下一主题Rust Trait