Z
ZHANK
编程在线教程Rust 教程Trait 约束与泛型
泛型与 Trait

Trait 约束与泛型

T: Trait 约束、+ 组合多个、where 子句、impl Trait 语法糖

Trait 约束与泛型

T: Trait 约束泛型参数——只接受实现了特定 trait 的类型。+ 组合多个,where 提高可读性。

学完本章你将: 掌握 T: Trait 约束、+ 组合、where 子句、impl Trait 语法糖。


Trait 约束语法

rust
// 方式 1:尖括号约束
fn notify<T: Summary>(item: &T) {
    println!("{}", item.summarize());
}

// 方式 2:impl Trait 语法糖(简洁)
fn notify(item: &impl Summary) {
    println!("{}", item.summarize());
}

// 两个参数——类型必须相同吗?
fn same_type<T: Summary>(a: &T, b: &T) { }    // 相同
fn diff_type(a: &impl Summary, b: &impl Summary) { }  // 可以不同

+ 组合多个约束

rust
// 必须同时实现 Summary 和 Display
fn notify(item: &(impl Summary + Display)) { }

// 泛型写法
fn notify<T: Summary + Display>(item: &T) { }

where 子句 —— 提高可读性

rust
// 约束多了很乱
fn complex<T: Display + Clone, U: Clone + Debug>(t: &T, u: &U) -> i32 { 0 }

// ✅ where 子句——清爽
fn complex<T, U>(t: &T, u: &U) -> i32
where
    T: Display + Clone,
    U: Clone + Debug,
{
    0
}

有条件的实现

rust
// 只为实现了 Display 的 T 实现 ToString trait
impl<T: Display> ToString for T { ... }

// 标准库就是这样做的——所有实现 Display 的类型自动获得 ToString