泛型是一种在编写代码时不指定具体类型,而在运用时再确定类型的编程技巧。它可以让我们编写出更加通用、可复用的代码,避免重复编写相似的代码。
在 Rust 中,泛型广泛应用于数据类型、函数和办法、trait 等方面。本文将具体介绍 Rust 中泛型的相关概念和用法。
泛型数据类型
在定义结构体或枚举时,我们可以运用泛型参数来代替具体的类型。这样,在运用这些结构体或枚举时,我们就可以为它们指定具体的类型。
例如,下面是一个运用泛型参数定义的Point
结构体:
struct Point<T> {
x: T,
y: T,
}
let int_point = Point { x: 1, y: 2 };
let float_point = Point { x: 1.0, y: 2.0 };
在上面的代码中,我们定义了一个名为Point
的结构体,它有两个泛型参数x
和y
。在运用这个结构体时,我们可以为它指定具体的类型,如int_point
和float_point
所示。
泛型函数和办法
在定义函数或办法时,我们也可以运用泛型参数来代替具体的类型。这样,在调用这些函数或办法时,我们就可以为它们指定具体的类型。
例如,下面是一个运用泛型参数定义的largest
函数:
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list {
if item > largest {
largest = item;
}
}
largest
}
let numbers = vec![1, 2, 3];
let result = largest(&numbers);
在上面的代码中,我们定义了一个名为largest
的函数,它承受一个泛型参数T
。在调用这个函数时,我们可以为它指定具体的类型,如result
所示。
泛型 trait
在定义 trait 时,我们也可以运用泛型参数来代替具体的类型。这样,在完结这些 trait 时,我们就可以为它们指定具体的类型。
例如,下面是一个运用泛型参数定义的Summary
trait:
pub trait Summary {
fn summarize<T: Display>(&self, value: T) -> String;
}
impl Summary for NewsArticle {
fn summarize<T: Display>(&self, value: T) -> String {
format!("{} - {}", self.headline, value)
}
}
在上面的代码中,我们定义了一个名为Summary
的 trait,它有一个泛型办法summarize
。在完结这个 trait 时,我们可以为它指定具体的类型,如NewsArticle
所示。
泛型捆绑
有时候,我们需求对泛型参数进行一些捆绑,以保证它们满足某些条件。在 Rust 中,我们可以运用 trait bound 和 where 子句来对泛型参数进行捆绑。
例如,在上面定义的largest
函数中,我们对泛型参数T
进行了如下捆绑:
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
// ...
}
上面代码中的<T: PartialOrd + Copy>
部分表明:泛型参数T
需求完结PartialOrd
和Copy
这两个 trait。这样,在调用这个函数时,我们就只能传入完结了这两个 trait 的类型。
除了运用 trait bound,我们还可以运用 where 子句来对泛型参数进行捆绑。例如,上面的largest
函数也可以写成这样:
fn largest<T>(list: &[T]) -> T
where
T: PartialOrd + Copy,
{
// ...
}
上面代码中的where T: PartialOrd + Copy
部分表明:泛型参数T
需求完结PartialOrd
和Copy
这两个 trait。这种写法与运用 trait bound 的作用是相同的,只是语法不同。
from刘金,转载请注明原文链接。感谢!