检查 where 子句中是否存在相同的关联类型

JDe*_*ler 2 generics rust

考虑这两个特征:

trait Iterator {
   type Item;

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

trait SeeekingIterator {
    type Item;

    fn next(&mut self, other: &Self::Item) -> Option<Self::Item>;
}
Run Code Online (Sandbox Code Playgroud)

现在假设,我想实现像std::iter::Peekable为实现这两个结构IteratorSeekingIterator

这看起来有点像:

struct PeekableSeekable<I>  where
    I: Iterator + SeekingIterator
{
    iter: I,
    peeked: Option<<I as Iterator>::Item>        
}
Run Code Online (Sandbox Code Playgroud)

它将实施

fn peek(&mut self) -> Option<&<I as Iterator>::Item>;
Run Code Online (Sandbox Code Playgroud)

fn peek_seek(&mut self, other: &<I as SeekingIterator>::Item) -> Option<&<I as SeekingIterator>::Item>   
Run Code Online (Sandbox Code Playgroud)

现在的问题是,这只有在<I as Iterator>::Item == <I as SeekingIterator>::Item.

我不知道有什么方法可以在where子句中表达这一点。我通过使用来伪造它

Option<<I as Iterator>::Item>: From<Option<<I as SeekingIterator>::Item>>
Run Code Online (Sandbox Code Playgroud)

Option<<I as SeekingIterator>::Item>: From<Option<<I as Iterator>::Item>>
Run Code Online (Sandbox Code Playgroud)

然后Option::from在需要转换时调用。这看起来有点难看,我想知道这个问题是否可以更简洁地解决。

She*_*ter 6

Reference one trait from the other trait constraint:

struct PeekableSeekable<I>
    where I: Iterator
{
    iter: I,
    peeked: Option<I::Item>,
}

impl<I> PeekableSeekable<I>
    where I: Iterator<Item = <I as SeekingIterator>::Item> + SeekingIterator
{
    // Implement
}
Run Code Online (Sandbox Code Playgroud)