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