考虑以下两个特征:

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。这似乎有点丑陋,我想知道是否可以更简洁地解决这个问题。

最佳答案

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

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
}

关于generics - 在where子句中检查相等的关联类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40553023/

10-11 17:59