泛型与 Trait
泛型让函数与类型对多种具体类型复用;trait 描述「具备的接口」,约束泛型参数能做什么。二者与 生命周期、错误处理(? 与 From)紧密相关。
泛型函数与结构体
fn largest<T: PartialOrd>(list: &[T]) -> &T { ... }
struct Pair<T> { a: T, b: T }- 类型参数可多个:
K, V等。 - trait 约束:
T: Debug + Clone,或where分行写,提高可读性。
trait 定义与实现
trait Describe {
fn describe(&self) -> String;
}
impl Describe for User { ... }- 默认方法:
trait内可提供带主体的函数。 - 关联类型
type Item、关联常量等用于迭代器等复杂 trait。
impl Trait 与 dyn Trait
| 写法 | 含义 |
|---|---|
fn f() -> impl Iterator<Item = u8> | 静态分发,返回某实现者(具体类型由编译器推断) |
fn g() -> Box<dyn Iterator<Item = u8>> | 动态分发,运行时查虚表,需 对象安全(object safe) |
常用标准库 trait(节选)
| Trait | 作用 |
|---|---|
Clone / Copy | 复制语义,见 所有权 |
Drop | 析构 |
Debug / Display | 格式化输出 |
Default | 默认值 |
Send / Sync | 线程边界,见 并发 |
Iterator | for 循环与适配器链 |
From / Into / TryFrom | 类型转换与 错误处理 |
#[derive(...)] 可自动实现部分 trait。
孤儿规则(orphan rule)
trait 与类型至少有一个在当前 crate 定义时,才能写 impl Trait for Type,避免随意给外部类型加外部 trait。