`Iterator` trait 中的 `type Item` 是什么意思

xud*_*fsd 3 rust

Iterator性状的定义如下:

pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}
Run Code Online (Sandbox Code Playgroud)

什么type Item;意思?以及如何称呼它?

上面的定义等价于这个定义吗?

pub trait Iterator<T> {
    fn next(&mut self) -> Option<T>;
}
Run Code Online (Sandbox Code Playgroud)

如果是一样的,为什么要那样声明呢?如果不一样,那么有什么区别呢?

Mat*_* M. 5

TL;DRtype Item;inIterator关联类型。


Rust 泛型有输入和输出类型:

  • 输入类型是在 trait 声明中指定的那些(trait X<T, U>hasTUas input types)加上Self(正在实现 trait 的具体类型)
  • 输出类型是通过 trait 定义中指定的类型 type X;

引入关联项目的RFCRFC 195: Associated Items。具体来说,它的动机部分引用了具有相关特征的好处。

对我来说,最重要的一点是unicity:为 trait 的任何给定实现定义了一个单一类型,例如,它允许干净地为Derefor Indextrait 提供动力。在一个DerefIndex可能产生许多可能类型的世界中,类型推断会更加复杂。