跳转到主要内容
模块 5 · 第 1 课(共 2)课程中的9/14~12 min
模块课程(1/2)

泛型和函数

泛型允许您编写灵活、可重用的代码,避免不同数据类型的逻辑重复。我们可以使用泛型类型参数,通常用字母 T 表示,而不是为不同类型(如 i32、f64 或 String)定义多个函数或结构。

Rust 编译器使用称为单态化的过程来管理泛型:在编译期间,它为实际使用的每个具体类型生成泛型代码的副本。这意味着运行时性能开销为零。


通用函数

要定义泛型函数,我们在函数名称之后和参数列表之前插入类型参数 <T> :

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

在泛型函数中,我们可以将泛型类型 T 用于参数类型和返回类型:

Rust
fn identity<T>(value: T) -> T {
    value
}

通用结构

我们还可以在结构体(struct)内使用泛型类型参数来定义灵活的字段:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

在泛型结构的 impl 块中,我们必须在 impl 关键字之后立即声明类型参数 <T> ,以指示我们正在泛型结构上实现方法:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

自己尝试一下

练习 1:点结构

锻炼#rust.m5.l1.e1
尝试:0加载中...

定义一个名为 Point<T> 的泛型结构体,其中包含两个字段:T 类型的 x 和 T 类型的 y。在 main 函数中,实例化一个变量 point,其中包含具有整数值 x = 5 和 y = 10 的 Point,然后打印 point.x 的值。

正在加载编辑器...
显示提示

使用 struct Point<T> { x: T, y: T }` 声明该结构。在 main 中实例化它并使用 `point.x` 来打印它。

3 次尝试后可用的解决方案

练习 2:通过交换反转元组

锻炼#rust.m5.l1.e2
尝试:0加载中...

编写一个名为 swap<T> 的通用函数,它接受两个元素 (T, T) 的元组,并返回一个位置相反的新元组 (T, T)。在主函数中,使用元组 (1, 2) 调用函数并打印结果。

正在加载编辑器...
显示提示

函数签名必须是“fn swap<T>(pair: (T, T)) -> (T, T)”。使用“(pair.1,pair.0)”返回反转的元组。

3 次尝试后可用的解决方案

练习 3:容器结构

锻炼#rust.m5.l1.e3
尝试:0加载中...

定义一个包含 T 类型值字段的通用 struct Container<T>。实现通用 impl 块来定义接受 T 类型值并返回 Container<T> 实例的新方法。

正在加载编辑器...
显示提示

使用 impl<T> Container<T> 实现关联方法 fn new(value: T) -> Self { Container { value } }`。

3 次尝试后可用的解决方案