关联类型

通过把容器内部的类型放到 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