在where

时间:2016-11-11 17:15:57

标签: generics rust

考虑以下两个特征:

trait Iterator {
   type Item;

   fn next(&mut self) -> Option<Self::Item>;
}

trait SeeekingIterator {
    type Item;

    fn next(&mut self, other: &Self::Item) -> Option<Self::Item>;
}

现在假设,我希望为实现std::iter::PeekableIterator的结构体实现SeekingIterator之类的内容。

这看起来有点像:

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

它会实现

fn peek(&mut self) -> Option<&<I as Iterator>::Item>;

fn peek_seek(&mut self, other: &<I as SeekingIterator>::Item) -> Option<&<I as SeekingIterator>::Item>   

现在的问题是,只有在<I as Iterator>::Item == <I as SeekingIterator>::Item时才会这样做。

我不知道如何在where条款中表达这一点。 我使用

伪造它
Option<<I as Iterator>::Item>: From<Option<<I as SeekingIterator>::Item>>

Option<<I as SeekingIterator>::Item>: From<Option<<I as Iterator>::Item>>

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

1 个答案:

答案 0 :(得分:4)

从另一个特质约束中引用一个特征:

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
}