Iterator
特征定义如下:
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
type Item;
是什么意思?怎么称呼它?
上面的定义等同于这个吗?
pub trait Iterator<T> {
fn next(&mut self) -> Option<T>;
}
如果是一样的,为什么要这样声明?如果不一样,有什么区别?
TL;DR:Iterator
中的type Item;
是相关的类型。
Rust泛型既有输入类型也有输出类型:
- 输入类型是在特性声明中指定的类型(
trait X<T, U>
将T
和U
作为输入类型)加上Self
(实现特性的具体类型) - 输出类型是通过
type X;
在特性定义中指定的类型
引入关联项的RFC是RFC 195:关联项。具体来说,它的动机部分列举了拥有相关特质的好处。
对我来说,最重要的一点是unicity:为特性的任何给定实现定义一个类型,例如,这允许为Deref
或Index
特性提供干净的电源。在Deref
或Index
可以产生许多可能的类型的世界中,类型推理将更加复杂。