考虑以下两个特征:
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
。这似乎有点丑陋,我想知道是否可以更简洁地解决这个问题。 最佳答案
从另一个特征约束中引用一个特征:
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/