考虑以下两个特征:
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::Peekable
和Iterator
的结构体实现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
。这看起来有点难看,我想知道这个问题是否可以更简洁地解决。
答案 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
}