为什么 Iterator::rev 定义在 Iterator 上而不是 DoubleEndedIterator

Sil*_*olo 6 iterator bidirectional rust

Rust 的迭代有两个主要特征:Iterator可以按顺序遍历的标准,以及DoubleEndedIterator可以从后面额外迭代的标准。

这对我来说很有意义。许多有用的方法都定义在Iteratormapfilter等上。然后,从“后面”操作的东西,可以说,像rfind和 一样rfold被定义,DoubleEndedIterator因为这样的操作只在这样的迭代器上才有意义。

但我们有Iterator::rev

fn rev(self) -> Rev<Self>
where
    Self: Sized + DoubleEndedIterator,
{
    Rev::new(self)
}
Run Code Online (Sandbox Code Playgroud)

rev是一个定义的函数,但也有Iterator一个附加约束。SelfDoubleEndedIterator

定义此函数有什么实际好处Iterator?我们只能在DoubleEndedIterator实现者和DoubleEndedIterator扩展上调用它,Iterator因此我们永远不会遇到实现前者而不是后者的情况。那么为什么没有在like和arerev上定义呢?DoubleEndedIteratorrfindrfold

Sta*_*eur 4

这允许:

  • Iterator在一处查看所有功能(文档) 。
  • 在不需要的情况rev()下使用,包括它,所以实际上这不是问题。我想通过让用户忽略存在来减少认知负荷。Iteratoruse DoubleEndedIteratorpreludeDoubleEndedIterator

  • 我不确定这是否真的解释了为什么 `rev()` 的处理方式与直接在 `DoubleEndedIterator` 特征上定义的方法不同。 (3认同)