考虑这两个特征:
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为实现这两个结构Iterator和SeekingIterator。
这看起来有点像:
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在需要转换时调用。这看起来有点难看,我想知道这个问题是否可以更简洁地解决。
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)
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |