关联类型

使用"关联类型"通过将内部类型局部移动到 trait 中作为输出类型,提高了代码的整体可读性。trait 定义的语法如下:

#![allow(unused)] fn main() { // `A` 和 `B` 在 trait 中通过 `type` 关键字定义。 // (注意:这里的 `type` 与用于类型别名的 `type` 不同) trait Contains { type A; type B; // 更新后的语法,用于泛型地引用这些新类型 fn contains(&self, _: &Self::A, _: &Self::B) -> bool; } }

注意,使用 Contains trait 的函数不再需要显式指定 AB

// 不使用关联类型 fn difference<A, B, C>(container: &C) -> i32 where C: Contains<A, B> { ... } // 使用关联类型 fn difference<C: Contains>(container: &C) -> i32 { ... }

让我们使用关联类型重写上一节的示例:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX