结论:GAT 允许 trait 的关联类型带泛型参数(尤其是生命周期参数),让"返回一个借用 self 的类型"这类接口可以被抽象成 trait。最典型的受益者:lending iterator(每个 item 借用迭代器本身)和 type Alias<'a> 式的容器视图,在 GAT 稳定(1.65)之前无法用 trait 表达,只能为每个具体类型手写重复实现。
展开:痛点示例:普通 Iterator 的 Item 与 &'a mut self 无关,item 必须完全拥有,所以"每次 yield 一个指向内部缓冲区的切片"的流式解析器实现不了;用 GAT:
trait LendingIterator {
type Item<'a> where Self: 'a;
fn next(&mut self) -> Option<Self::Item<'_>>;
}
where Self: 'a 子句是必需的——声明"只在 Self 活得够久时该类型才有意义",这也是 GAT 语法里最容易漏的部分。其他应用:async trait 的手写等价(type Fut<'a> 返回借用 self 的 future,正是 async fn in trait 稳定前的官方 workaround)、表达"指针家族"的通用指针 trait。易错点:GAT 与 trait object 基本无缘(object safety 受限),需要动态分发时仍要绕路;HRTB(for<'a>)能表达"对所有生命周期"但表达不了"类型随生命周期变化",这正是 GAT 的独有地带。
追问方向:GAT 与 HRTB 的表达力边界、type alias impl trait(TAIT)与 GAT 的组合。